【发布时间】:2019-08-18 02:59:54
【问题描述】:
我试图对 C 进行 100 的阶乘运算,结果发生了整数溢出,但我不明白为什么我的无符号变量变为负数。
int main(void)
{
unsigned long value =1;
for(unsigned long n = 0;n<100;n++){
printf("This n %ld\n",value);
value *= (n+1);
}
printf("%ld\n",value);
return 0;
}
对于无符号变量,变量容量溢出后,不应该重新从0开始吗?
value的第一个值:
This current value 2
This current value 6
This current value 24
This current value 120
This current value 720
This current value 5040
This current value 40320
This current value 362880
This current value 3628800
This current value 39916800
This current value 479001600
This current value 6227020800
This current value 87178291200
This current value 1307674368000
This current value 20922789888000
This current value 355687428096000
This current value 6402373705728000
This current value 121645100408832000
This current value 2432902008176640000
This current value -4249290049419214848
这怎么可能?
【问题讨论】:
-
你对
printf()撒了谎——你说你传递了一个(签名的)long,所以它听了你的话并打印了位模式,就好像它代表一个签名的long,并且该位模式被解释为负数。更改为%lu并要求它以十进制打印unsigned long。 (是的:无符号变量环绕并在零处重新启动。)
标签: c unsigned integer-overflow