-1
#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 位内存。我认为我上面假设的解释是经过认证的:)

4

1 回答 1

3

由于您的变量是long long,打印它们的唯一正确printf格式是%lld. 使用其他任何东西都是自找麻烦,是不确定的行为。

这适用于任何系统和任何编译器(IdeOne 演示):

#include <stdio.h>

int main()
{
    long long a=1,b=2,c=3;
    long long d=0x123456789ABC;
    long long e=0x000000000000;
    printf("%lld,%lld,%lld\n",a,b,c);
    printf("%lld,%lld\n",d,e);
    return 1;
}
于 2013-04-25T04:11:06.733 回答