可能的重复:
两个字符相加产生 int

给出以下 C++ 代码:

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

unsigned char c = (a + b) / 2;

输出为 150 逻辑上 符合预期,但是表达式中不应出现整数溢出 (a + b)?

显然,必须有一个整数提升来处理这里的溢出,或者发生了我看不到的其他事情。我想知道是否有人可以启发我,这样我就可以知道在整数提升和溢出方面我可以和不应该依赖什么。

有帮助吗?

解决方案

C++ 和 C 都不使用“较小”整数类型执行算术计算,例如, charshort. 。这些类型几乎总是被提升为 int 在任何进一步的计算开始之前。所以,你的表达实际上被评估为

unsigned char c = ((int) a + (int) b) / 2;

附:在一些奇异的平台上,范围 int 不涵盖范围 unsigned char, , 方式 unsigned int 将用作促销的目标类型。

其他提示

不,这不是错误。

编译器始终以最小整数精度进行计算,仅在赋值时将结果转换回 unsigned char。

这是标准里的。

根据其他答案,这不是一个错误 在 x86 和其他(健全的)32 位和 16 位架构上.

然而,在较小或不太健全的架构(通常是非常小的微控制器)上,这样的事情可能会开始引起麻烦,特别是如果实现编译器的人没有一些较大公司的测试/验证预算(同样,微控制器)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top