使用unsigned long int时的垃圾值

时间:2015-08-08 06:18:02

标签: c unsigned-integer

程序:

#include<stdio.h>
int main()

{

    unsigned long int i=1902;

    int j=0;

    while(j<10)

    {

     i=i*10;

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

     j++;

    }
}

为什么我只能获得最多5次迭代的正确结果?请帮助我获得所有迭代的正确答案。看到范围,我将int更改为unsigned long int,但仍无法更正错误。

3 个答案:

答案 0 :(得分:3)

我的猜测是你使用的是Microsoft Visual Studio编译器的32位系统,。我想这是因为unsigned long似乎是32位,这意味着它可以达到的最大值略高于40亿。

如果你想要一个64位的值,你需要使用unsigned long long,这几乎是所有类似PC的系统的64位。

答案 1 :(得分:0)

因为此时该值超出了unsigned long int可以表示的范围,从0到4,294,967,295。

答案 2 :(得分:0)

unsigned long int几乎是每个C编译器中的4个字节。

这里我用1902初始化。 您在每次迭代时将i的值乘以10。

签名long int的范围是-2,147,483,648到2,147,483,647。 通过使变量无符号,您只能将正整数的范围加倍,即从0到4,294,967,295。

变量i中的值在6次迭代后越过无符号整数的最大范围。因此显示溢出和负数。

如果要表示较大的数字,请使用大小为64位的long long int,范围为-9223372036854775807至9223372036854775807。