Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么不是';默认情况下不检查溢出_Java_C_Integer Overflow - Fatal编程技术网

Java 为什么不是';默认情况下不检查溢出

Java 为什么不是';默认情况下不检查溢出,java,c,integer-overflow,Java,C,Integer Overflow,我在SO上发现了一些关于在执行操作之前检查溢出/下溢行为的问题。似乎有很多方法可以很容易做到这一点。那么,为什么在执行之前没有自动检查每个数学运算的选项,或者为什么算术运算的缓冲区溢出/下溢没有例外呢?或者用不同的措辞:在什么情况下,允许操作在不被注意的情况下溢出是有用的 这可能是运行时间的问题吗?或者,溢出的主要来源是在非数学运算期间发生的 Java语言没有内置此功能作为关键字或机制直接应用于+、-和*运算符。例如,C#已选中此项的和未选中的关键字。但是,当语言中没有本机支持时,这些检查可能成

我在SO上发现了一些关于在执行操作之前检查溢出/下溢行为的问题。似乎有很多方法可以很容易做到这一点。那么,为什么在执行之前没有自动检查每个数学运算的选项,或者为什么算术运算的缓冲区溢出/下溢没有例外呢?或者用不同的措辞:在什么情况下,允许操作在不被注意的情况下溢出是有用的


这可能是运行时间的问题吗?或者,溢出的主要来源是在非数学运算期间发生的

Java语言没有内置此功能作为关键字或机制直接应用于
+
-
*
运算符。例如,C#已选中此项的
未选中的
关键字。但是,当语言中没有本机支持时,这些检查可能成本高昂且难以实现。对于Java1.8,方法和已添加到API中以提供此功能,正如在注释中所指出的

为什么即使语言支持,也不能自动执行此操作?简单的答案是,一般来说,过流和下流是可以接受或想要的行为,或者它们根本不会发生,因为一个复杂且执行良好的设计应该如此。我想说的是,利用过流和下流是一种低级或硬件编程问题,以避免出于性能原因而进行额外操作

总体而言,您的应用程序设计应该明确说明算术溢出和下溢的合理使用,或者完全不需要使用它们,因为这可能会导致混乱、不直观的行为或严重的错误。在第一种情况下,你不检查,在第二种情况下,检查将是无用的。自动检查是多余的,只会降低性能成本


想要溢出的人为例子可能是计数器。假设你有一个未签名的空头,然后把它数起来。65536之后,由于溢出,它会返回到零,这很方便。

Java语言没有内置此功能作为关键字或机制直接应用于
+
-
*
运算符。例如,C#已选中此项的
未选中的
关键字。但是,当语言中没有本机支持时,这些检查可能成本高昂且难以实现。对于Java1.8,方法和已添加到API中以提供此功能,正如在注释中所指出的

为什么即使语言支持,也不能自动执行此操作?简单的答案是,一般来说,过流和下流是可以接受或想要的行为,或者它们根本不会发生,因为一个复杂且执行良好的设计应该如此。我想说的是,利用过流和下流是一种低级或硬件编程问题,以避免出于性能原因而进行额外操作

总体而言,您的应用程序设计应该明确说明算术溢出和下溢的合理使用,或者完全不需要使用它们,因为这可能会导致混乱、不直观的行为或严重的错误。在第一种情况下,你不检查,在第二种情况下,检查将是无用的。自动检查是多余的,只会降低性能成本


想要溢出的人为例子可能是计数器。假设你有一个未签名的空头,然后把它数起来。65536之后,由于溢出,它会返回到零,这可能很方便。

我可以提供两个潜在因素来解释为什么未检查的算术是默认值:

  • 熟悉感:默认情况下C和C++中的算术是不受约束的,习惯了这些语言的人不会期望程序抛出,而是默默地继续。这是一个误解,因为C和C++都有符号整数溢出/下溢的未定义行为。但尽管如此,它在许多人的头脑中创造了某种期望,同一个家庭的新语言往往避免明显地打破既定惯例
  • 基准性能:检测溢出/下溢通常需要执行比您决定忽略它所需的更多的指令。想象一下如果一个不熟悉它的人写了一个数学重的基准(如它经常发生的)和“证明”的话,即使是最简单的数学运算,语言也比C和C++的速度慢得多。这将损害人们对语言表现的感知,并可能阻碍其采用

我可以提供两个潜在的因素来解释为什么未经检查的算术是默认的:

  • 熟悉感:默认情况下C和C++中的算术是不受约束的,习惯了这些语言的人不会期望程序抛出,而是默默地继续。这是一个误解,因为C和C++都有符号整数溢出/下溢的未定义行为。但尽管如此,它在许多人的头脑中创造了某种期望,同一个家庭的新语言往往避免明显地打破既定惯例
  • 基准性能:检测溢出/下溢通常需要执行比您决定忽略它所需的更多的指令。想象一下如果一个不熟悉它的人写了一个数学重的基准(如它经常发生的)和“证明”的话,即使是最简单的数学运算,语言也比C和C++的速度慢得多。这将损害人们对语言表现的感知,并可能阻碍其采用

实际上,对于C,有检查选项,请参见此处:

对于java,添加整数溢出检查将