我写了这个简单的代码来生成高达1005的所有正整数的4次幂.它只能在整数215之间正常工作.之后它会给出错误的读数.为什么这样?
# include<stdio.h>
int main(void)
{
int i;
unsigned long long int j;
for (i = 1; i <= 1005; i++){
j = i*i*i*i;
printf("%i.........%llu\n",i,j);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
你可以通过做这个小改动来修复它.
unsigned long long i;
Run Code Online (Sandbox Code Playgroud)
问题在于,在行中j = i*i*i*i;,右侧int在被分配之前被计算为j.因此,如果i^4超过整数限制,它将基本上开始变为负值并且当更高位被削减时开始循环.当负号被分配给j,因为j是无符号的,-i变成了max - i,这是巨大数字来自的地方.您还需要将printf格式说明符更改%i为%llufor i.
您也可以通过执行以下操作来解决此问题
j = (unsigned long long)i*i*i*i;
Run Code Online (Sandbox Code Playgroud)
这基本上强制演员j在执行乘法之前的类型.
完整性检查 - 215 ^4= 2136750625,非常接近signed int2,147,483,647的上限.