我正在编译以下C代码:
#include <stdio.h>
int main()
{
int nEndIndex = -1;
printf("nEndIndex : %ld\n", nEndIndex);
return 0;
}
我正在使用GCC 4.2.4进行编译,如下所示:
[kartika@alto ~/junk]$ gcc -o test test.c
[kartika@alto ~/junk]$ ./test
nEndIndex : 4294967295
[kartika@alto ~/junk]$ gcc --version
gcc (GCC) 4.2.4
Copyright (C) 2007 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
我认为,因为long
大于int
所以使用%ld
应该不会有问题。既然它们都是signed
我为什么要得到这个输出呢?
答案 0 :(得分:5)
参数的类型(在促销之后,在这种情况下不适用)必须匹配格式字符串的预期类型;否则行为未定义。
通常允许将int
传递给期望long int
的函数,并导致隐式转换。但对于像printf
这样的可变函数,编译器不知道将参数转换为什么类型。
行为是未定义的,这意味着任何事情都可能发生(包括,如果你是不幸,代码看起来正常“正常”)。实际上,我们假设int
是32位而long
是64位(这些大小因系统而异)。 printf
可能会从堆栈中获取64位数据,从参数中获取32位数据,再获取32位垃圾数据;然后它将打印该数据假设它是一个long int
对象(因为这是你通过格式字符串告诉它的。)
对%d
参数使用int
,%ld
参数使用long int
。
答案 1 :(得分:0)
该变量未声明为long int
。声明应为long int nEndIndex = -1;