1

我正在学习 C,并且在 Kernighan&Ritchie 的书中读到整数int包含在特定集合中 [-32767;32767]。我试图通过编写以下程序来验证这个断言,该程序将变量计数从 1 增加到极限,然后再变为负数。

#include <stdio.h>

int main(void){
    int count = 1;
    while(count > 0){
        count++;
        printf("%d\n", count);
    }

    return 0;
}

令人惊讶的是,我得到了这个输出:

1
......
2147483640
2147483641
2147483642
2147483643
2147483644
2147483645
2147483646
2147483647 -> This is a lot more than 32767?!
-2147483648 

我不明白,为什么我得到这个输出?我怀疑 M. Ritchie 犯了一个错误;)

4

2 回答 2

2

您在 32 位或 64 位机器上,并且您使用的 C 编译器具有 32 位整数。在 2 的补码二进制中,最大的正整数将是 31 位,或者2^31-1or 2147483647,正如您所观察到的。

请注意,这并不违反 K&R 声称整数值包含范围 [-32768;32767] 的说法。

于 2013-08-23T01:48:36.943 回答
1

空头通常从 -32768 到 32767。2^15th - 1 是最大的空头。

整数通常从 -2147483648 到 2147483647。2^31st -1 是最大的整数。

基本上整数是你想象的两倍。

于 2013-08-23T01:48:01.517 回答