请考虑以下代码:
#include <stdio.h>
int main()
{
printf("%d", 300 * 300 / 300);
return 0;
}
当在标准GCC编译器上运行时,此代码将结果显示为300
,但是当我使用Turbo C运行它时,结果为81
。为什么会这样?
我知道TC使用2个字节来存储整数,结果300 * 300
显然会超过这个限制,但是在打印之前它再次被300分为右边?
另外先计算什么? 300 / 300
或300 * 300
?)
这种行为的原因是什么?
答案 0 :(得分:6)
在打印之前它将它除以300,但溢出已经发生,因为整数文字被评估为int
s,当你除以时,你已经使用溢出的int结果。
由于*
和/
具有相同的优先级,因此首先评估*
(since evaluation is left to right)
但是,您可以执行300 * (300/300)
或300L * 300 / 300
答案 1 :(得分:2)
在Turbo C中,int
是16位宽。 300 * 300 = 90000 = 15F90h
15F90h将被截断为5F90h = 24464
。如果您将24464
与300
分开,则会得到81
。
在GCC int
中通常是32位(不确定DOS中的GCC,以及其他异国/过时的平台)。 32位足以容纳90000
。