Java Integer.MIN_值除以-1 为什么这行代码很重要?(没有它我会得到一个错误的答案) 问题是:
不使用乘法、除法和mod运算符对两个整数进行除法 如果溢出,则返回2147483647 答复Java Integer.MIN_值除以-1 为什么这行代码很重要?(没有它我会得到一个错误的答案) 问题是:,java,integer-overflow,Java,Integer Overflow,不使用乘法、除法和mod运算符对两个整数进行除法 如果溢出,则返回2147483647 答复 公共整数除法(整数除法,整数除法){ 如果(除数=0){ 返回红利>0?整数.MAX\u值:整数.MIN\u值; } 如果(股息==0){ 返回0; } 如果(被除数==Integer.MIN_值和除数==-1){ 返回Integer.MAX_值; } 布尔值isNeg=(被除数>0&&除数=向下){ int-shift=0; 而(向上>=(向下因为,Integer.MAX\u VALUE和Intege
公共整数除法(整数除法,整数除法){
如果(除数=0){
返回红利>0?整数.MAX\u值:整数.MIN\u值;
}
如果(股息==0){
返回0;
}
如果(被除数==Integer.MIN_值和除数==-1){
返回Integer.MAX_值;
}
布尔值isNeg=(被除数>0&&除数<0)| |(被除数<0&&除数>0);
多头上涨=数学绝对值((多头)股息);
Long down=Math.abs((长)除数);
int res=0;
while(向上>=向下){
int-shift=0;
而(向上>=(向下因为,Integer.MAX\u VALUE
和Integer.MIN\u VALUE
的绝对值不相等
整数。最大值为2147483647
Integer.MIN\u值为-2147483648
如果将Integer.MIN_VALUE
除以-1
,该值将溢出(2147483648>2147483647
),因此该操作必须有一个限制。Java使用32位存储int
最大int值为231-1
最小int值为-231
换句话说,int没有足够大的值来存储231(-Integer.MIN_value
)
if (dividend == Integer.MIN_VALUE && divisor == -1) {
return Integer.MAX_VALUE;
}
public int divide(int dividend, int divisor) {
if(divisor == 0){
return dividend > 0 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
}
if(dividend == 0){
return 0;
}
if (dividend == Integer.MIN_VALUE && divisor == -1) {
return Integer.MAX_VALUE;
}
boolean isNeg = (dividend > 0 && divisor < 0) || (dividend < 0 && divisor > 0);
Long up = Math.abs((long) dividend);
Long down = Math.abs((long) divisor);
int res = 0;
while(up >= down){
int shift = 0;
while(up >= (down << shift)){
shift++;
}
up -= down << (shift - 1);
res += 1 << (shift - 1);
}
return isNeg ? -res : res;
}
0111 1111 1111 1111 1111 1111 1111 1111
1000 0000 0000 0000 0000 0000 0000 0000