知识点
1、二进制符号位
在二进制码中,为了区分正负数,采用最高位是符号位的方法来区分,正数的符号位为0、负数的符号位为1.剩下的就是这个数的绝对值部分,
2、& ~ | ^ 运算符
-
&
与运算符;两个操作数中位都为1,结果才为1,否则结果为0 -
~
非运算符;如果位为0,结果是1,如果位为1,结果是0 -
|
或运算符;两个位只要有一个为1,那么结果就是1,否则就为0 -
^
异或运算符;两个操作数的位中,相同则结果为0,不同则结果为1
3、算术溢出
在定点计算机中,从正方向超过了数的表示范围,称为上溢;从负方向超过了数的表示范围,则称为下溢。
上溢会得到一个最大的负数,下溢获得到一个最大的正数;
分析
算术溢出只可能发生在两个正数的和是负数,或者两个负数的和是正数;
public static int addExact(int x, int y) {
int r = x + y;
// HD 2-12 Overflow iff both arguments have the opposite sign of the result
if (((x ^ r) & (y ^ r)) < 0) {
throw new ArithmeticException("integer overflow");
}
return r;
}
((x ^ r) & (y ^ r)) < 0
->((x ^ r) & (y ^ r)) < 0
的符号位是1
->(x ^ r)
和(y ^ r)
的符号位都是1
->x
和r
的符号位不同 ; y
和r
的符号位不同
->x
和y
的符号位是相同的,且与r
的符号位不同
->两个符号位相同的数相加却得到了一个符号位不同的和
->溢出了
网友评论