数据类型 - 溢出

时间:2015-08-28 18:37:48

标签: c

如果我们考虑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 ;
}

1 个答案:

答案 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次乘法的全零。