代码段(一):
int a = 2147483648;
int b = a / -1;
printf(“%d,%d\n”,a, b);
代码段(二):
int a = 2147483648;
int b = -1;
int c = a / b;
printf("%d,%d\n", a, c);
从C语言的角度来说,这两个代码段的功能完全一样,但是,运行结果却截然不同。代码段(一)的执行结果为“-2147483648, -2147483648”,而代码段(二)在Linux上的执行结果为“Floating point exception”,在Windows上的执行结果又不是“Floating point exception”。显然,在代码段(一)中,CPU没有检测到异常;而在代码段(二)中,CPU检测到了异常,操作系统内核进行了相应的处理。
在这个例子中有以下疑问: 变量a明明被赋予的是正数,为什么打印出来的却是负数?为什么负数a与-1相除,结果还是负数呢?为什么明明是“除法错”异常,却显示是浮点异常呢?代码(一)和代码(二)都是除法运算,为什么执行结果不同呢?代码段(二)在Windows平台上的执行结果为什么不是“Floating point exception”?
这样的例子还能举出很多。从这些例子可以看出,真正要理解程序的行为还需要学习隐藏在编程语言背后的许多内容。这些影响程序执行结果的隐藏在编程语言背后的内容就是“计算机系统基础”。
Welcome computer system architecture!