【发布时间】:2017-12-03 00:13:40
【问题描述】:
我正在学习不同数据类型的特征。例如,这个程序越来越多地以四种不同的格式打印 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;
}
它有效。 unsigned 上升到 2147483648。 integer 上升到 -2147483648。但是为什么会变成负数呢?
我有个理论:是不是因为我们在 32 位机器上可以表示的最大有符号整数是2147483647?如果是,为什么返回负数?
【问题讨论】:
-
你的理论是对的。发生过低
-
您的程序导致有符号整数溢出,这是未定义的行为。
-
经常,因为 未定义的行为 是未定义的。有符号整数溢出是未定义。一个有点可能的结果是卷入负面区域,但这不能保证 -> 您的程序没有定义的行为。
-
谢谢你们确认我的嫌疑人。您是否建议任何参考资料来帮助我更好地理解诸如此类的未定义行为?
-
Consult the Standard 以便更好地理解 C 的各个方面。Here is a section 总结了未定义的行为。