为什么在添加两个字符时没有出现整数溢出?
Why don't I get an integer overflow when adding two chars?
可能的重复项:
添加两个字符会产生 int
给定以下C++代码:
unsigned char a = 200;
unsigned char b = 100;
unsigned char c = (a + b) / 2;
输出在逻辑上是 150,但是表达式中不应该有整数溢出(a + b)
吗?
显然,必须有一个整数提升来处理这里的溢出,或者正在发生我看不到的其他事情。我想知道是否有人可以启发我,这样我就可以知道在整数提升和溢出方面我可以和不应该依赖什么。
C++ 和 C 都不是 C 使用"较小"的整数类型(如 char
和 short
)执行算术计算。这些类型几乎总是在任何进一步计算开始之前提升为int
。所以,你的表情真的被评估为
unsigned char c = ((int) a + (int) b) / 2;
附言在一些int
范围未覆盖unsigned char
范围的异国情调平台上,unsigned int
类型将用作促销的目标类型。
不,这不是错误。
编译器始终以最低整数精度进行计算,结果将仅在赋值时转换回无符号字符。
这是标准。
根据其他答案,这不是x86和其他(理智的)32位和16位架构上的错误。
然而,在较小或不太理智的架构(通常是非常小的微控制器)上,这样的事情可能会开始引起麻烦,特别是如果实现你的编译器的人没有一些大公司的测试/验证预算(再次,微控制器)。
相关文章:
- 整数溢出,最大值为 pow(10,19)
- 模函数,避免C++整数溢出
- 优化正在杀死我在 clang 6 中的整数溢出检查
- 从双精度转换为整数的显式类型是否始终检查整数溢出?
- 运行时错误:有符号整数溢出:964632435 * 10 无法在类型 'int' 中表示
- 我很难理解这些关于检测整数溢出的评论
- 检测 32 位整数溢出
- 如何在没有整数溢出的情况下找到n%(k*k)
- C 中俄罗斯农民算法中的整数溢出
- 检查Android NDK COD中的整数溢出
- 对于特定情况的整数溢出似乎是由整数溢出引起的错误
- 如何修复整数溢出警告
- 整数溢出 C++ 即使使用“无符号长整型”也是如此
- 整数溢出是否会影响其他变量
- 为什么功能不给整数溢出
- 有符号整数溢出、内部函数和未定义的行为
- 整数溢出不会发生:它们从0重新启动
- 以下程序中最大 int 1000 000(在 int 范围内)的整数溢出
- 为什么Turbo C Wraparound每次签名的整数溢出,尽管签名的整数溢出是不确定的
- 编译器是否有可能检测整数溢出或其他数据类型溢出的可能性