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