负功率为2

Wor*_*ice 5 c types

我正在学习不同数据类型的特征.例如,该程序越来越多地使用四种不同格式打印2的强大功能:integer, unsigned integer, hexadecimal, octal

#include<stdio.h>
int main(int argc, char *argv[]){
        int i, val = 1;
        for (i = 1; i < 35; ++i) {
                printf("%15d%15u%15x%15o\n", val, val, val, val);
        val *= 2;
        }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

有用.unsigned上去2147483648.integer上去-2147483648.但为什么它变得消极?

我有一个理论:是因为我们可以在32位机器上表示的最大有符号整数是2147483647?如果是这样,为什么它会返回负数?

小智 5

首先,你应该明白这个程序是未定义的.它会导致有符号整数溢出,并且在C标准中声明为未定义.

技术原因是不能预测任何行为,因为负数允许不同的表示,并且表示中甚至可能存在填充位.

在你的情况下你看到负数的最可能的原因是你的机器使用2的补码(查找它)来表示负数,而算术运算在没有溢出检查的位上.因此,最高位是符号位,如果您的值溢出到该位,则它变为负数.