目录
说明
在计算机里面一个数值是使用二进制的补码进行保存(原码、补码、反码)
机器数
一个数在计算机中的表现形式叫做机器数,这个数有正负之分,在计算机中用一个数的最高位(即为符号位)用来表示它的正负,其中0表示正数,1表示负数。
原码
用第一位表示符号,其余位表示值。因为第一位是符号位,所以8位二进制数的取值范围就是:[1111_1111 , 0111_1111] 即 [-128 , 127]
原码是容易被人脑所理解的表达方式
反码
正数的反码是其本身。负数的反码是符号位保持不变,其余位取反。例如正数1的原码是[0000_0001],它的反码是是其本身
[0000_0001],-1的原码是[1000_0001],其反码是[1111_1110]
补码
正数的补码是其本身。负数的补码是在其反码的基础上+1,例如正数1的原码是[0000_0001],他的补码是其本身[0000_0001],
-1的补码是[1111_1110]+1=[1111_1111]
二进制
在java里面使用0b或者0B作为前缀表示这个数为二进制的数值 例如:0b01010011
最高位是符号位:正数为0 负数为1
二进制转换为10机制操作(规律:m*2^(n-1)),n表示当前的第几位
练习:求-1的二进制,假设位数是8位
扩展:知道-1的二进制,那么-9的二进制为
八进制
3位的2进制可以表示一个8进制的数值,从低位开始,每三位一组,不够则补0
在java里面使用0作为前缀表示这个数为八进制的数值 例如:0776 (规律:m*8^(n-1)):7*8^2+7*8^1+6*1==510
十六进制
0~9 abcdef【10、11、12、13、14、15】(规律:m*16^(n-1))
在java里面使用0x或者0X示这个数为十六制的数值 例如:0X76ee
一定要掌握二进制如何转换为8、10、16进制,反之一样
0111_1011_0110_1110 转换为16进制(一般用下划线来分割)
0x7b6e
01_101_110 转换为8进制
0156
01110110 转换为10进制
64+32+16+4+2=118
进制转换记忆
下面是一些记忆它们之间转换顺序的方法:
- 二进制到十进制:二进制数中的每一位数都对应着一个特定的十进制数。例如,二进制的
101
(表示为1
后面跟着0
和1
)转换为十进制是5
。 - 十进制到二进制:将十进制数除以
2
,得到商和余数,然后用余数作为新的被除数,重复这个过程,直到商为0
。将每次得到的余数逆序排列,就可以得到对应的二进制数。例如,十进制的5
转换为二进制是101
。 - 八进制到十进制:八进制数中的每一位数都对应着一个特定的十进制数。例如,八进制的
123
(表示为1
后面跟着2
和3
)转换为十进制是51
。 - 十进制到八进制:将十进制数除以
8
,得到商和余数,然后用余数作为新的被除数,重复这个过程,直到商为0
。将每次得到的余数逆序排列,就可以得到对应的八进制数。例如,十进制的51
转换为八进制是123
。 - 十六进制到十进制:十六进制数中的每一位数都对应着一个特定的十进制数。例如,十六进制的
1A
(表示为1
后面跟着A
,其中A
代表10
)转换为十进制是26
。 - 十进制到十六进制:将十进制数除以
16
,得到商和余数,然后用余数作为新的被除数,重复这个过程,直到商为0
。将每次得到的余数逆序排列,就可以得到对应的十六进制数。例如,十进制的26
转换为十六进制是1A
。
记忆这些转换顺序的一个好方法:记住每个进制系统的基数,并理解每个进制系统中每个位置代表的数值范围。例如,在二进制中,只有0
和1
,而在十六进制中,有0-9
以及A-F
(分别代表10-15
)。