不确定为什么这个演员有效

Unsure why this cast works

我有以下代码:

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。

我在这里错过了什么?

您的 short 在添加前已升级为 int

http://en.cppreference.com/w/cpp/language/implicit_conversion(link是关于C++的,但C的规则基本相同)

Integral promotion

...arithmetic operators do not accept types smaller than int as arguments, and integral promotions are automatically applied...