长时间打印负数int会产生错误的结果

时间:2014-11-25 04:41:40

标签: c

我正在编译以下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我为什么要得到这个输出呢?

2 个答案:

答案 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;