因为语言是这样定义的。它允许更容易地在更多种类的硬件上(例如带有饱和算术的 DSP)开发符合规范的实现。
取决于编程语言。一些硬件支持,你也许可以在程序中利用它们。
C/C++ 中关于整数溢出的方法是提供在您所使用的机器上最快的行为,因此在某些机器上(假设为 16 位有符号整数):
32766 + 2 == -32768
但在其他一些机器上则为:
32766 + 2 == 32767
对于其他机器,您可能会遇到陷阱值或 CPU 执行的任何操作。
请注意,Java 已经完美地定义了整数溢出,以实现“编写一次,随处运行”。
至于无符号整数,它们的大多数应用程序都是位掩码、位字段和数字操作(模运算、标识符)——正是您不希望它们未定义的操作。
一些编程语言具有这样的安全措施,而一些则没有:
Python 3 会自动将溢出的值转换为 long 类型(任意大的整数)。
在 C/C++ 中,您必须自己检查溢出条件,climits(C)和 limits(C++)头文件已经为每种类型定义了最大和最小值。
在 x86 汇编中编程——FLAGS 和 EFLAGS 寄存器中有 CF(进位标志)用于无符号和 OF(溢出标志)用于有符号,以检查何时发生溢出。
许多编程语言也有任意精度类型,以防止溢出,但是操作会更慢,因为这些变量在理论上可以达到你的内存大小。
int
和long
值,并且它们的行为在任何地方运行时都是一致的。如果您将1添加到Integer.MAX_VALUE,则会得到Integer.MIN_VALUE(它会回绕),如果您从Long.MIN_VALUE减去1,则会得到Long.MAX_VALUE。char
,它是16位的。 - Peter Lawrey