可能的重复项:
添加两个字符会产生 int
给定以下C++代码:
unsigned char a = 200;
unsigned char b = 100;
unsigned char c = (a + b) / 2;
输出在逻辑上是 150,但是表达式中不应该有整数溢出(a + b)
吗?
显然,必须有一个整数提升来处理这里的溢出,或者正在发生我看不到的其他事情。我想知道是否有人可以启发我,这样我就可以知道在整数提升和溢出方面我可以和不应该依赖什么。
C++ 和 C 都不是 C 使用"较小"的整数类型(如 char
和 short
)执行算术计算。这些类型几乎总是在任何进一步计算开始之前提升为int
。所以,你的表情真的被评估为
unsigned char c = ((int) a + (int) b) / 2;
附言在一些int
范围未覆盖unsigned char
范围的异国情调平台上,unsigned int
类型将用作促销的目标类型。
不,这不是错误。
编译器始终以最低整数精度进行计算,结果将仅在赋值时转换回无符号字符。
这是标准。
根据其他答案,这不是x86和其他(理智的)32位和16位架构上的错误。
然而,在较小或不太理智的架构(通常是非常小的微控制器)上,这样的事情可能会开始引起麻烦,特别是如果实现你的编译器的人没有一些大公司的测试/验证预算(再次,微控制器)。