我没有得到答案背后的逻辑。我试图打印一个后定义的值,它显示a = 72。请帮忙。
#include<stdio.h>
main()
{
int a=400*400/400;
if(a==400)
printf("Do good");
else
printf("Have good");
}
输出:有好的
答案 0 :(得分:10)
我想你的平台上int
是2字节宽,16位。
然后
400*400 = 28928
由于溢出
28928/400 = 72
答案 1 :(得分:4)
400*400 = 160 000 = 18 bits.
如果将其转换为16位,则会得到28928
。
28928 / 400 = 72,32
答案 2 :(得分:0)
由于其他答案未涉及问题的标题:
*
和/
具有相同的优先级,具有从左到右的关联性。这意味着400 * 400在分裂之前发生。
谷歌搜索C中的运算符优先级会导致http://en.cppreference.com/w/c/language/operator_precedence成为第一个匹配。您是否尝试使用Google搜索问题的标题?
其他答案已经很好地解释了72
是由于int
在您的平台上为16位。您可以使用400UL * 400 / 400
将结果与unsigned long
计算,或ULL
计算unsigned long long
,因为unsigned long
必须至少为32位。
另一种避免整数溢出的方法是将其写为400 * (400/400)
,以便首先进行除法。