注:蓝色字均为资料外链,建议阅读
-
原码为signBit+数值位
对应补码 正数不变
负数的补码符号位不变,其后1变为零直到最后一个1. 反码加一码
特殊情况:负零的原码、反码,定义为负的最大值的补码(补码比原码和反码多表示一个数 )。
按位运算先化为补码,最后手算输出时化为原码(先-1(第33位默认可借1)再作反码,若为-2e31则化不为原码),实际计算机不作变换,全用补码。public class demo{ public static void main(String [] args){ int a = (int)-2e31,b=-2; //a 的补码表示为1000 0000 0000 0000 0000 0000 0000 0000 //b 的补码表示为1111 1111 1111 1111 1111 1111 1111 1110 // 数值的加减操作对应码的数值位的加减操作 比如-1 = -2 + 1; // -1 的补码就是b的补码加一 System.out.println(a|0);//不会做补码到原码的转换其实,因为对于计算机补码表示的范围大 //只要是在范围内的数学运算就是合理的,合理不合理,只是针对人类理解 System.out.println(a-1);//溢出变为正的最大值。应该由程序员避免。 //符号位照样参与了运算。 System.out.println(b+b);//-4 合理 补码:1111 1111 1111 1111 1111 1111 1111 1100 //反码 == 补码减一 1111 1111 1111 1111 1111 1111 1111 1011 //原码(为了自己能看懂) == 1000 0000 0000 0000 0000 0000 0000 0100 //计算机实际不做这种转换! //hsp讲的不太清楚。 System.out.println(0-1);//-1 合理 补码:1111 1111 1111 1111 1111 1111 1111 1111 //默认了第33位可借,所有都参与运算。 } }
-
算数移位:
算术右移:a >> b ⇔ a ÷ 2b
算术左移:a << b ⇔ a × 2b
逻辑右移运算符: a >>> b ⇔ a补码向右溢出b个bit,高位补零。
无逻辑左移 -
a % b ⇔ aabb (a - (int)a / b * b)
eg. -10.5 % 3 = -10.5 - (int)(-10.5) / 3 * 3 = -10.5 - (-9) = -1.5step 1. -10.5 / 3 = - 3.5 若取余运算则
整数商
为-3(余靠近零) 若取模则为-4
step 2. -10.5 - (-3 * 3) = -1.5 (rem结果 (口诀余商近零、异符同前(钱) 同符为正))
-10.5 - (-4 * 3) = 1.5 (mod结果 (口诀模商近地、异符同后
)) -
浮点数iEEE754参考资料