整数溢出 - 为什么不呢

时间:2011-05-17 00:46:24

标签: c++ integer integer-overflow integer-promotion

  

可能重复:
  Addition of two chars produces int

给出以下C ++代码:

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

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

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

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

3 个答案:

答案 0 :(得分:13)

C ++和C都没有使用“较小”整数类型执行算术计算,例如charshort。在进一步计算开始之前,这些类型几乎总是被提升为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位架构上的并非错误

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