在循环中加倍数字会产生意外结果

时间:2014-02-16 23:37:58

标签: c

为什么会这样?我想象8 *= 2会是16?我也试过了i += i但得到了相同的输出。

从我的代码中可以看出,目标是获得2 ^ 1000。

#include <stdio.h>
#include <windows.h>

int main(int argc, char *argv[])
{
    int i = 2;
    int x;
    for(x = 0; x < 1000; x++){
        i*=2;
        printf("%d\n", i);
        Sleep(200);
    }
    printf("%d", i);

    return 0;
}

输出:

4
8
10
20
40
80
100
200
400
800
1000
2000
4000
8000
10000
20000
40000
80000
100000
200000
400000
800000
1000000
2000000
4000000
8000000
10000000
20000000
40000000
80000000
0

3 个答案:

答案 0 :(得分:11)

我不认为这是您正在运行的实际代码。我想你实际上得到了:

printf("%x\n", i);

由于您还有一个名为x的变量,所以这将是一个简单的拼写错误。

或者,也许您以某种方式更改了整数打印基数。结果 加倍,但您似乎以十六进制打印它们。

0x004  =   4 decimal
0x008  =   8 decimal
0x010  =  16 decimal
0x020  =  32 decimal
0x040  =  64 decimal
0x080  = 128 decimal
0x100  = 512 decimal

答案 1 :(得分:1)

sizeof(int)很可能是系统上的32位。尝试使用unsigned long而不是int。 sizeof(long)应该是64位,并且通过在前面放置'unsigned'将为正数提供更宽的范围。

对于printf()一个无符号长整数,使用%lu

答案 2 :(得分:1)

看起来数字以十六进制显示。我不知道为什么。顺便说一句,你永远不会达到2 ^ 1000,因为32位整数可以存储的最高数字是2 ^ 32 - 1.