鉴于以下C++代码:
unsigned char a = 200;
unsigned char b = 100;
unsigned char c = (a + b)/2;
的输出是150 逻辑预期,然而在表达式中不应该存在整数溢出?
显然必须有一个整数提升来处理这里的溢出,或者是其他的事情我看不到。我想知道是否有人能够启发我,所以我可以知道我能做什么,不应该依赖整数提升和溢出。
鉴于以下C++代码:
unsigned char a = 200;
unsigned char b = 100;
unsigned char c = (a + b)/2;
的输出是150 逻辑预期,然而在表达式中不应该存在整数溢出?
显然必须有一个整数提升来处理这里的溢出,或者是其他的事情我看不到。我想知道是否有人能够启发我,所以我可以知道我能做什么,不应该依赖整数提升和溢出。
C++ not C既不使用“较小”整数类型(如char
和short
)执行算术计算。在开始进一步的计算之前,这些类型几乎总是被提升为int
。所以,你的表情真的被评估为
unsigned char c = ((int) a + (int) b)/2;
P.S.在int
范围内的某个异国平台不覆盖unsigned char
的范围时,unsigned int
将被用作促销的目标类型。
不,这不是一个错误。
编译器总是以最小整数精度进行计算,结果将仅在赋值时转换回无符号字符。
这是在标准中。
根据其他答案,x86和其他(理智)32位和16位体系结构不是错误。然而,在较小或较不健全的架构(通常非常小的微控制器)上,这样的事情可能会开始引起麻烦,尤其是如果谁实施了你的编译器,谁没有测试/验证一些大公司的预算那里(再次,微控制器)。
对于一个写得很好的问题+1。 – GManNickG 2011-05-17 00:48:35