为什么在添加两个字符时没有出现整数溢出?

Why don't I get an integer overflow when adding two chars?

本文关键字:整数 溢出 字符 添加 两个 为什么      更新时间:2023-10-16

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

给定以下C++代码:

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

输出在逻辑上是 150,但是表达式中不应该有整数溢出(a + b)吗?

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

C++ 和 C 都不是 C 使用"较小"的整数类型(如 charshort)执行算术计算。这些类型几乎总是在任何进一步计算开始之前提升为int。所以,你的表情真的被评估为

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

附言在一些int范围未覆盖unsigned char范围的异国情调平台上,unsigned int类型将用作促销的目标类型。

不,这不是错误。

编译器始终以最低整数精度进行计算,结果将仅在赋值时转换回无符号字符。

这是标准。

根据其他答案,这不是x86和其他(理智的)32位和16位架构上的错误。

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