给出以下C ++代码:
unsigned char a = 200;
unsigned char b = 100;
unsigned char c = (a + b) / 2;
输出为逻辑预期的150,但是表达式(a + b)
中不应该有整数溢出?
显然必须有一个整数提升来处理这里的溢出,或者其他一些我无法看到的事情。我想知道是否有人可以启发我,所以我可以知道我能做什么,不应该依赖于整数提升和溢出。
答案 0 :(得分:13)
C ++和C都没有使用“较小”整数类型执行算术计算,例如char
和short
。在进一步计算开始之前,这些类型几乎总是被提升为int
。所以,你的表达式实际上被评估为
unsigned char c = ((int) a + (int) b) / 2;
P.S。在int
范围不涵盖unsigned char
范围的某些异国平台上,类型unsigned int
将用作促销的目标类型。
答案 1 :(得分:7)
不,这不是错误。
编译器始终以最小整数精度计算,结果将仅在赋值时转换回unsigned char。
这是标准。
答案 2 :(得分:0)
根据其他答案,x86和其他(理智的)32位和16位架构上的并非错误。
然而,在较小或较不理智的架构(通常是非常小的微控制器)上,这样的事情可能会开始引起麻烦,特别是如果实施编译器的人没有某些较大公司的测试/验证预算那么(再次,微控制器)。