我正在学习不同数据类型的特征.例如,该程序越来越多地使用四种不同格式打印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的补码(查找它)来表示负数,而算术运算在没有溢出检查的位上.因此,最高位是符号位,如果您的值溢出到该位,则它变为负数.