#include<stdio.h>
int main()
{
long long a=1,b=2,c=3;
long long d=0x123456789ABC;
long long e=0x000000000000;
printf("%d,%d,%d\n",a,b,c);
printf("%d,%d\n",d,e);
return 1;
}
在 32 位 UBUNTU 系统中,由 32 位 g++ 编译,上面的程序将打印:
1,0,2
0,305419896
我猜这是因为 printf() 根据“%d”以 32 位的步长从堆栈中读取参数。所以它首先打印出 d 的低 32 位(即 0),然后打印出 d 的高 32 位(即 305419896)。
但是当用 64bit g++ 编译时,它会打印:
1,2,3
0,0
首先是 d 的低 32 位(即 0),然后是 e 的低 32 位(即 305419896)。为什么有区别?32 位 g++ 和 64 位 g++ 中的 printf() 处理参数的方式不同吗?
我只是想出了一个可能的解释。在 64 位系统中,一个 32 位大小的整数实际上占用 64 位内存,高 32 位用 0 填充。所以 printf() 为下一个参数跳转 64 位,即使它是由 "%d" 指定的
××××××××××××××××××××××××Qualds解决了问题~~我只是试图在32bit System上运行以下程序
long long d=0x004300420041;
long long e=0x000000000044;
printf("%c, %c\n",d,e);
printf("%d, %d\n",d,e);
输出为 AC 4325441 67
"%c" 和 "%d" 都会导致 32 位的跳转,这意味着 int 和 char 类型在 32 位系统中占用 32 位内存,在 64 位系统中占用 64 位内存。我认为我上面假设的解释是经过认证的:)