整数溢出 - 为什么不呢

dec*_*iar 14 c++ integer integer-overflow integer-promotion

可能重复:
添加两个字符会产生int

给出以下C++代码:

unsigned char a = 200;
unsigned char b = 100;

unsigned char c = (a + b) / 2;
Run Code Online (Sandbox Code Playgroud)

逻辑上预期输出为150 ,但表达式中(a + b)是否应该存在整数溢出?

显然必须有一个整数提升来处理这里的溢出,或者其他一些我无法看到的事情.我想知道是否有人可以启发我,所以我可以知道它是什么,我不能依赖于整数提升和溢出.

AnT*_*AnT 13

C++和C都没有执行带有"较小"整数类型的算术计算,如charshort.int在进一步计算开始之前,这些类型几乎总是被提升.所以,你的表达式实际上被评估为

unsigned char c = ((int) a + (int) b) / 2;
Run Code Online (Sandbox Code Playgroud)

PS在某些异国情调的平台上,其范围int不包括范围unsigned char,该类型unsigned int将用作促销的目标类型.


seh*_*ehe 7

不,这不是错误.

编译器始终至少计算整数精度,结果将仅在赋值时转换回unsigned char.

这是标准.