GCC和TC给出不同的输出?
考虑下面的代码:GCC和TC给出不同的输出?
#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
?) 这种行为的原因是什么?
打印之前它将它除以300,但溢出已经发生,因为整数字面值被评估为int
s,所以在分割时,您已经使用了溢出的int结果。
由于*
和/
具有相同的优先级,则*
首先(since evaluation is left to right)
您可以评价,但是,请执行300 * (300/300)
或300L * 300/300
y不gcc失败然后??即使在gcc上,300 * 300'也必须是溢出的? – sasidhar
gcc对int使用4个字节。计算300 * 300没有超载。 –
在涡轮C,int
是16个位宽。 300 * 300 = 90000 = 15F90h
15F90h将被截断为5F90h = 24464
。如果将24464
与300
相除,则会得到81
左侧。
在海湾合作委员会int
通常是32位(不知道在DOS和其他外来/过时的平台GCC)。 32位足以容纳90000
。
GCC不会失败.....看看这个.. http://www.ideone.com/Lvbox 是吗? – sasidhar
检查两个实现的整数大小:'printf(“sizeof int是%d \ n”,(int)sizeof 300);' – pmg