C代码只运行到某一点

use*_*355 0 c

我写了这个简单的代码来生成高达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)

Kar*_*k T 6

你可以通过做这个小改动来修复它.

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的上限.