无符号变量发生整数溢出
Integer overflow happening with unsigned variables
我试图在 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
这怎么可能?
%ld
in printf
会将任何数字解释为带符号的数字。每个数字都可以读作有符号或无符号。要将 unsigned long 打印为 unsigned,您应该将 %lu
传递给 printf
。
无符号数和有符号数的区别在于编译器在处理该变量时将选择使用哪些汇编指令。在汇编级别,有一些指令集旨在处理应该是有符号数的内容,而其他指令集则用于处理无符号数(例如,当您通过 if
语句检查变量的值时,如果它被声明为有符号编译器将生成一些指令,如果不是,编译器将生成其他指令)。 char c = -1
和 unsigned char c = 255
在内存中存储为完全相同的值。
我试图在 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
这怎么可能?
%ld
in printf
会将任何数字解释为带符号的数字。每个数字都可以读作有符号或无符号。要将 unsigned long 打印为 unsigned,您应该将 %lu
传递给 printf
。
无符号数和有符号数的区别在于编译器在处理该变量时将选择使用哪些汇编指令。在汇编级别,有一些指令集旨在处理应该是有符号数的内容,而其他指令集则用于处理无符号数(例如,当您通过 if
语句检查变量的值时,如果它被声明为有符号编译器将生成一些指令,如果不是,编译器将生成其他指令)。 char c = -1
和 unsigned char c = 255
在内存中存储为完全相同的值。