一、正数的原码补码反码都是一样的;
比如5
原码:[0000 0000 0000 0000 0000 0000 0000 0101]
反码:[0000 0000 0000 0000 0000 0000 0000 0101]
补码:[0000 0000 0000 0000 0000 0000 0000 0101]
二、负数的原码符号位为1,反码为按位取反,补码为反码加1;
比如-5
原码:[1000 0000 0000 0000 0000 0000 0000 0101]
反码:[1111 1111 1111 1111 1111 1111 1111 1010]
补码:[1111 1111 1111 1111 1111 1111 1111 1011]
三、正数的左移右移
比如5<<2 因为正数的原码补码反码都是一样的,左移就可以直接操作
原码:[0000 0000 0000 0000 0000 0000 0000 0101]
左移两位,左移后右边补0
0000 0000 0000 0000 0000 0000 0000 0101 -------->5
00 0000 0000 0000 0000 0000 0000 010100 -------->20
四、负数的左移右移
比如-5<<2 因为程序识别的是补码,所以要先进行转化
原码:[0000 0000 0000 0000 0000 0000 0000 0101]
反码:[1111 1111 1111 1111 1111 1111 1111 1010]
补码:[1111 1111 1111 1111 1111 1111 1111 1011]
补码左移:
1111 1111 1111 1111 1111 1111 1111 1011 ---->补码
(11)11 1111 1111 1111 1111 1111 1111 101100 ----->补码左移
1000 0000 0000 0000 0000 0000 0001 0011 ------>补码求反
1000 0000 0000 0000 0000 0000 0001 0100 ------>加一得原码
总结: 机器读的都是补码,所以都要转换为补码进行计算
正数的原码反码补码都是正数本身
负数的原码按位取反首位为1,补码在反码的基础上加1。补码的原码相当于补码的补码