14

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

给定以下 C++ 代码:

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

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

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

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

4

3 回答 3

13

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

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

PS在一些范围int不覆盖范围的奇异平台上unsigned char,该类型unsigned int将被用作促销的目标类型。

于 2011-05-17T00:49:18.517 回答
7

不,这不是错误。

编译器总是以最小的整数精度计算,结果将仅在赋值时转换回无符号字符。

这是在标准中。

于 2011-05-17T00:49:10.467 回答
0

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

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

于 2011-05-17T00:53:26.860 回答