C语言 无符号变量发生整数溢出



我试图在 C 上做一个 100 的阶乘,发生了整数溢出,但我不明白的是为什么我的无符号变量变成负数。

int main(void)
{
unsigned long value =1;
for(unsigned long n = 0;n<100;n++){
printf("This n %ldn",value);
value *= (n+1);
}
printf("%ldn",value);
return 0;
}

对于无符号变量,变量容量溢出后,不应该再次从 0 开始吗?

值的第一个值:

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中的%ld会将任何数字解释为有符号数字。每个数字都可以读作有符号或无符号。要打印您的未签名,只要没有签名,您应该将%lu传递给printf

无符号数字或有符号数字之间的区别在于编译器在处理此变量时将选择使用哪个程序集指令。在程序集级别,有一组指令设计用于处理应该是有符号的数字,而其他指令集用于处理无符号数字(例如,当您通过if语句检查变量的值时,如果它被声明为有符号,编译器将生成一些指令,如果不是,编译器将生成其他指令(。char c = -1unsigned char c = 255在内存中存储为完全相同的值。

最新更新