Tag: 32位 64位

_Complex long int

TL;博士; 问: _Complex long int中int含义是什么? 为什么合法? 更长的版本 我将一些32位代码移植到64位安全。 在一个地方,我注意到它使用: static __complex__ long int i32X[256]; 转储搜索并替换为int32_t更改“long int”给了我一个编译错误。 complex是一个较旧的GNUism,由标准_Complex取代。这是一个重现问题的简短代码片段: #include #include typedef _Complex long int WhyAmILegal; typedef _Complex int32_t Snafu; typedef int32_t _Complex Snafu2; 在gcc下编译给出: complextest.c:6:26: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘Snafu’ typedef _Complex int32_t Snafu; ^~~~~ complextest.c:8:17: error: two or more data […]

32位到64位内联汇编移植

我有一段C ++代码(在GNU / Linux环境下用g ++编译)加载一个函数指针(它是如何做的无关紧要),用一些内联汇编将一些参数压入堆栈然后调用该函数,代码如下: unsigned long stack[] = { 1, 23, 33, 43 }; /* save all the registers and the stack pointer */ unsigned long esp; asm __volatile__ ( “pusha” ); asm __volatile__ ( “mov %%esp, %0″ :”=m” (esp)); for( i = 0; i < sizeof(stack); i++ ){ unsigned long val = stack[i]; […]

调用C函数,该函数不带参数参数

关于C调用约定和64/32位编译之间可能存在未定义的行为,我有一些奇怪的问题。 首先是我的代码: int f() { return 0; } int main() { int x = 42; return f(x); } 正如你所看到的,我用参数调用f,而f不带参数。 我的第一个问题是这个论点在调用时是否真的给了f。 神秘的线条 经过一点点objdump我得到了好奇的结果。 传递x作为f的参数: 00000000004004b6 : 4004b6: 55 push %rbp 4004b7: 48 89 e5 mov %rsp,%rbp 4004ba: b8 00 00 00 00 mov $0x0,%eax 4004bf: 5d pop %rbp 4004c0: c3 retq 00000000004004c1 : 4004c1: 55 push […]

为什么C中的双精度是8字节对齐?

我正在阅读一篇关于内存中数据类型对齐的文章( 这里) ,我无法理解一点,即 请注意,双变量将在32位机器上的8字节边界上分配,并且需要两个存储器读取周期。 在64位机器上,根据存储体的数量,双变量将在8字节边界上分配,并且只需要一个存储器读周期。 我的疑问是:为什么需要在8字节边界上分配双变量而不是4字节? 如果它仍然分配在4字节边界上,我们只需要2个存储器读周期(在32位机器上)。 如果我错了,请纠正我。 如果有人有一个关于成员/内存对齐的好教程,请分享。

移位32位变量32位有什么不好?

我最近选择了Bruce Schneier的Applied Cryptography副本,这是一本很好的阅读。 我现在明白本书中概述的几种算法是如何工作的,我想在C中开始实现其中的一些算法。 许多算法的共同点是将x位密钥分成几个较小的y位密钥。 例如,Blowfish的密钥X是64位,但是你需要将它分成两个32位的一半; Xl和Xr。 这就是我陷入困境的地方。 我对C相当不错,但对于按位运算符等,我并不是最强的。 在IRC上获得一些帮助之后,我设法提出了这两个宏: #define splitup(a, b, c) {b = a >> 32; c = a & 0xffffffff; } #define combine(a, b, c) {a = (c << 32) | a;} 其中a是64位,b和c是32位。 但是,编译器警告我,我正在将32位变量移位32位。 我的问题是这些: 移位32位变量32位有什么不好? 我猜它是未定义的,但这些宏似乎确实有效。 另外,你会建议我换一种方式吗? 正如我所说的,我对C非常熟悉,但是按位运算符等仍让我头疼。 编辑 我发现我的组合宏实际上并没有组合两个32位变量,而只是简单地将0和0相加,并得到一个结果。 所以,除了我以前的问题,我仍然没有一种方法将两个32位变量组合起来得到一个64位变量; 关于如何做的建议将不胜感激。