Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.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中比较INT是安全的?_Java_Integer Overflow - Fatal编程技术网

为什么在Java中比较INT是安全的?

为什么在Java中比较INT是安全的?,java,integer-overflow,Java,Integer Overflow,为什么,考虑到: int a = ..., b = ... ; 这是否不安全: a - b 但这是安全的: a > b 所谓安全,我的意思是保证不受溢出的影响(我正在编写一个int的比较器)。比较a>b本身是安全的,因为a和b都没有改变。操作a-b可能不安全,因为可能会溢出 但是,以前的溢出可能会影响以后进行的比较a>b的正确性。减去非常大的负数将导致溢出,因为结果可能小于原始数(在数学中,减去负数应增加原始数),这意味着a>b可能是意外的结果 如果a-b用于比较器,首先它似乎满足比

为什么,考虑到:

int a = ..., b = ... ;
这是否不安全:

a - b
但这是安全的:

a > b

所谓安全,我的意思是保证不受溢出的影响(我正在编写一个int的
比较器)。

比较
a>b
本身是安全的,因为
a
b
都没有改变。操作
a-b
可能不安全,因为可能会溢出

但是,以前的溢出可能会影响以后进行的比较
a>b
的正确性。减去非常大的负数将导致溢出,因为结果可能小于原始数(在数学中,减去负数应增加原始数),这意味着
a>b
可能是意外的结果

如果
a-b
用于
比较器
,首先它似乎满足
比较器
的约定:返回一个小于零、等于零或大于零的数字,如果该值小于、等于或大于另一个值。但只有在不发生溢出的情况下才是这样

如果
a=1000
b=Integer.MIN\u值+100
(一个非常大的负数,
-2147483548
),则
a-b
将溢出。真正的数学结果将是
500-Integer.MIN_值
,一个大于
Integer.MAX_值
(2147484548)的值。因此,正返回值将指示
a>b
,这显然是正确的


但是溢出时,值最终小于零(
-2147482748
),错误地指示
a

,这取决于。。。请参阅,它建议时间比较使用
t1-t0<0,而不是t1

如果
a
为正,而
b
为负,并且它们的差值大于MAX_整数,则为溢出。是的,请关注第二部分(
a>b
),我正在编写ints的比较器,不要重新发明轮子,使用
Integer#compare(int a,int b)
From:对操作数执行二进制数字升级。。。如果提升后的操作数类型为int或long,则执行有符号整数比较。你到底不明白什么?在我最后的评论中,我把重点放在了这个问题上:不要重新发明轮子@Kiel Intel有很多不同的CPU。也许旧的4004用SUB作比较。。。但是从1970年以后我看到的每一个CPU都有比较指令。另外,任何将>实现为减法指令的编译器都足够聪明,可以生成不会因溢出而出错的代码,因此,任何中间溢出都将在内部处理并对程序员隐藏。@Kiel指的是将执行该比较的ASM代码
@LouisWasserman通常通过计算两个操作数的差来进行比较。然后他们负责处理符号问题,或者JIT来生成解决该问题的汇编代码。我认为这不是因为