原码、反码、补码
原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。
比如9,其二进制原码就是1001。根据当前编程语言int所占的字节位数,在前面补零。比如在java中int占4位,所以原码为 00000000 00000000 00000000 00001001 。
反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。
比如9,原码为 00000000 00000000 00000000 00001001 ,所以反码为 11111111 11111111 11111111 11110110 。
补码:反码加1称为补码
比如9,反码为 11111111 11111111 11111111 11110110 ,所以补码为 11111111 11111111 11111111 11110111 。
正数与负数的二进制表示
-
正数:按照正值的原码表示
9 的原码是
00000000 00000000 00000000 00001001 -
负数:按照其正值的补码形式表示
-9 的原码是
00000000 00000000 00000000 00001001-9 的反码为
11111111 11111111 11111111 11110110-9 的补码是
11111111 11111111 11111111 11110111
无符号数和有符号数
- 无符号数:最高位的1或0,和其它位一样,用来表示该数的大小。
- 有符号数:最高数称为“符号位”。为1时表示负值,为0时表示正值。
比如无符号数表示的范围是[0, 255] ; 那么有符号数表示的范围就是[-128, 127)
注意:
-
无符号数可以是正数,也可以是负数
-
同样,有符号数可以是正数,也可以是负数
关键是自己决定最高位拿不拿来当符号位,如果用,就是有符号数;反之就是无符号数。与正负数无关。
无符号左移与右移、有符号左移与右移
以下统一:
如果移动的位数超过当前变量所能表示的最大位数,计算机会自动对移动的位数取模。
比如java中int能存储32位,如果要求移动32位,相当于不移动,因为32%32=0;如果要求移动35位,相当于移动3位,因为35%32=3 。
1. 无符号数右移
直接右移,右边移出的部分删除,左边空出的部分补零
比如 9 。原来是 00000000 00000000 00000000 00001001 ,右移2位后为 00000000 00000000 00000000 00000010
比如 -9 。原来是11111111 11111111 11111111 11110111 ,右移2位后为00111111 11111111 11111111 11111101
java中无符号数右移的方法:10进制数>>>右移的位数
2. 有符号数右移
右移后,右边移出的部分删除,左边空出的部分都用符号位补充
比如 9 。原来是 00000000 00000000 00000000 00001001 ,右移2位后为 00000000 00000000 00000000 00000010 。因为符号位为0,所以补两个0
比如 -9 。原来是11111111 11111111 11111111 11110111 ,右移2位后为11111111 11111111 11111111 11111101 。因为符号位为1,所以补两个1
java中无符号数右移的方法:10进制数>>右移的位数
3. 左移
左移不区分有符号和无符号,方法一样。
左移后,左边移出的部分删除,右边空出的部分都用0补充
java中左移的方法:10进制数<<左移的位数