我有以下代码:
unsigned short a, b, c, d;
unsigned long result;
a = 30000;
b = 40000;
c = 50000;
d = 60000;
result = (unsigned long)(a + b + c + d) / 4;
printf("result is %i", result);
结果是(30000 + 40000 + 50000 + 60000)/ 4 = 180000/4 = 45000,这是正确的。但我想知道为什么。我希望添加无符号短路溢出,因为它是在16位完成的,并且在加法之后溢出的结果被转换为无符号长整数然后除以4。
我在这里缺少什么?
答案 0 :(得分:1)
您的short
在添加之前已提升为int
。
http://en.cppreference.com/w/cpp/language/implicit_conversion(链接是关于C ++的,但C规则基本相同)
整体推广
...算术运算符不接受小于
int
的类型作为参数,并且会自动应用整数促销...