我正在使用TurboC ++。我写下面的表达式并没有得到正确的评价,我错过了它背后的一些概念吗?
int c=300*300/300;
printf("%d",c);
输出
81
为什么?
答案 0 :(得分:27)
300*300 is 90000.
假设int是16位,那么你已经溢出。
溢出环绕,给你:24464
。
24465/300 = 81.55
不要依赖于此。这是未定义的行为。
答案 1 :(得分:9)
300 * 300/300的评估从左到右进行。
300 * 300溢出16位有符号整数类型(Turbo C ++中的int
为16位)。由于计算将在带符号的算术中进行,结果未定义。
发生的事情是300 * 300正在回合给你24464.(24464 + 32768 + 32768 = 90000)。
24464/300在整数除法中是81。