如果我们考虑long long unsigned int中的溢出,溢出后它将始终生成一个正数。 例如,当a不是2的倍数时,下面的代码生成正数。 但如果a是2的倍数,如2,4,6 ......溢出后它会打印0。 为什么呢?
#include<stdio.h>
#define LLU long long unsigned int
#define a 5
int main()
{
LLU t=2;
int i=0;
for(i=0; i<100; i++)
{
t=t*a;
printf("%llu\n",t) ;
}
return 0 ;
}
答案 0 :(得分:4)
重复乘以2
在溢出时产生零的原因与在数字位数固定时重复乘以1乘以10的原因相同:每次乘法产生由a组成的二进制数单1
,后面都是零。
以下是8位数字的工作原理:
Power of 2 Decimal Binary Last 8 bits
---------- ------- ---------- ------------
0 1 1 00000001
1 2 10 00000010
2 4 100 00000100
3 8 1000 00001000
4 16 10000 00010000
5 32 100000 00100000
6 64 1000000 01000000
7 128 10000000 10000000
8 256 100000000 00000000 <<== 1 "falls off the end"
请注意,8的8位的最后8位都是零,所以如果我们只有8位,我们将在第8次乘法后得到零。所有后续乘法也将产生零。
与LLU
完全相同,除了需要64次乘法才能使数字溢出为零。
编辑:所有偶数在其二进制表示的末尾都为零,出于同样的原因,所有可被10整除的十进制数在其十进制表示的末尾至少有一个零。因此,如果从任何偶数开始,不一定是2的幂,则每次乘法会使数字末尾的零数增加乘以该数的零数。例如,如果乘以14
(二进制为1110
),结果将在结尾处获得额外的零。如果您乘以12
1100
,则会得到两个额外的零。
总体结果与乘以2相同:由于每次乘法会使尾部零的数量增加至少一个,因此LLU
最多可以得到64次乘法的全零。