2011-05-17 57 views
14

可能重复:
Addition of two chars produces int整数溢出 - 为什么不

鉴于以下C++代码:

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

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

的输出是150 逻辑预期,然而在表达式中不应该存在整数溢出?

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

+5

对于一个写得很好的问题+1。 – GManNickG 2011-05-17 00:48:35

回答

13

C++ not C既不使用“较小”整数类型(如charshort)执行算术计算。在开始进一步的计算之前,这些类型几乎总是被提升为int。所以,你的表情真的被评估为

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

P.S.在int范围内的某个异国平台不覆盖unsigned char的范围时,unsigned int将被用作促销的目标类型。

7

不,这不是一个错误。

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

这是在标准中。

0

根据其他答案,x86和其他(理智)32位和16位体系结构不是错误。然而,在较小或较不健全的架构(通常非常小的微控制器)上,这样的事情可能会开始引起麻烦,尤其是如果谁实施了你的编译器,谁没有测试/验证一些大公司的预算那里(再次,微控制器)。