2011-08-18 103 views
3

考虑下面的代码: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/300300 * 300?) 这种行为的原因是什么?

+0

GCC不会失败.....看看这个.. http://www.ideone.com/Lvbox 是吗? – sasidhar

+1

检查两个实现的整数大小:'printf(“sizeof int是%d \ n”,(int)sizeof 300);' – pmg

回答

6

打印之前它将它除以300,但溢出已经发生,因为整数字面值被评估为int s,所以在分割时,您已经使用了溢出的int结果。

由于*/具有相同的优先级,则*首先(since evaluation is left to right

您可以评价,但是,请执行300 * (300/300)300L * 300/300

+0

y不gcc失败然后??即使在gcc上,300 * 300'也必须是溢出的? – sasidhar

+3

gcc对int使用4个字节。计算300 * 300没有超载。 –

2

在涡轮C,int是16个位宽。 300 * 300 = 90000 = 15F90h 15F90h将被截断为5F90h = 24464。如果将24464300相除,则会得到81左侧。

在海湾合作委员会int通常是32位(不知道在DOS和其他外来/过时的平台GCC)。 32位足以容纳90000