在维基百科上阅读这篇文章关于整数溢出 http://en.wikipedia.org/wiki/Integer_overflow
我不太明白为什么有符号整数溢出会导致未定义的行为,但无符号整数溢出会导致环绕。为什么它们的行为有差异?
另一个问题:编程语言通常有防止整数溢出的保护措施吗?
造成这种差异的主要原因是 C 和 C++ 语言规范允许实现使用以下三种不同的有符号整数表示形式之一
- 1的补码
- 2的补码
- 有符号震级
如果语言规范在有符号溢出的情况下强制执行某些特定行为(即,优先考虑上述表示形式之一而不是其他两种表示形式),则它将强制基于两种非优先表示形式的平台实现“重”有符号整数算术。这将变得必要,因为此类平台的自然机器级行为与语言标准所需的行为不匹配。这些实现必须不断监视签名溢出并调整结果以符合标准要求。
这将严重降低使用不受欢迎的有符号表示的平台上有符号整数算术的性能,当然,这在 C 和 C++ 等语言中是完全不可接受的,这些语言被设计为在以下情况下尽可能接近底层硬件:它涉及诸如整数算术之类的基本运算。
该行为的原因是不明确的(与“*未指定”相对)是因为有些平台会在整数算术期间发生有符号溢出时故意生成硬件异常。请注意,该行为仅对于算术运算未定义,这些运算通常由机器执行。带符号溢出的值转换不会产生未定义的行为(该行为实际上是实现定义的)。
至于无符号类型,它们在所有平台上的表示方式相同,这意味着在所有平台上要求一致的行为不是问题。概念上与“模 2^宽度”行为相匹配的环绕是几乎所有已知二进制硬件平台上的自然行为。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)