Day 2 原码补码反码
原码
在二进制当中,可没有数字前面加一个负号就可以表示负数这么一说,那么我们怎么表示一个二进制负数呢?
我们可以在二进制中加一个符号位来区分正数与负数
比如在 8 8 8 位二进制数中,用第 8 8 8 为作为符号位,可以用 00000010 00000010 00000010 表示 2 2 2 ,用 10000010 10000010 10000010 表示 − 2 -2 −2
带有符号位的二进制数,就叫做原码,而这个原码的绝对值就叫做真码,也就是原码去掉符号位
所以 **原码 = 符号位 + 真码**
反码
正数的反码是正数的原码,而负数的反码就不一样了
负数的反码就是负数的原码除了符号位,其余位取反
比如 10001010 10001010 10001010 的反码就是 11110101 11110101 11110101
补码
又是一个灵魂拷问:“在数学当中,负数的意义是什么呢?”
− 1 -1 −1 就是表示一个加上 1 1 1 就等于 0 0 0 的数
− 2 -2 −2 就是表示一个加上 2 2 2 就等于 0 0 0 的数
− 114514 -114514 −114514 就是表示一个加上 114514 114514 114514 就等于 0 0 0 的数
那么补码的意义就是为了表示一个负数的意义
负数 + 补码的真值 = 0 0 0
也可以用另一种定义方式:补码 = = = 反码 + 1 + 1 +1
在计算机当中,有一个神奇的现象,你可以试试,在 Dev-C++ 中,让程序输出 cout << (~5) ;
得到的会是
−
6
-6
−6 ( ~5
是
5
5
5 取反的意思)
有同学就会说了,这不对呀! 5 5 5 的二进制明明是 101 101 101 ,取反之后不应该是 010 010 010 也就是 2 2 2 吗?为什么输出的是 − 6 -6 −6 呢
原来, 在计算机中是这样是用补码存储的
$00000101$
的反码是 $11111010$
,而 $11111010$
的补码就是反码$ + 1$
了
即 $10000101+1 = 100000110 = (-6)_2$
了
总结来说,可以归纳为一个表格
反码 | 补码 | |
---|---|---|
正数 | 是它本身 | 是它本身 |
负数 | 符号位不变,其余按位取反 | 反码+1 |
二进制、八进制、十六进制之间的转换
2 3 = 8 2^3 = 8 23=8 ,所以在二进制和八进制之间可以三位三位地转换
例如 0100010111 0100010111 0100010111 我们可以三位三位的拆开 0 100 010 111 0\ 100\ 010\ 111 0 100 010 111 每三位数对应的数字就是 4 , 2 , 7 4,2,7 4,2,7 了,直接连起来
就有 ( 427 ) 8 (427)_8 (427)8
进制转换就是那么简单
同理可得, 2 4 = 16 2^4 = 16 24=16 ,所以二进制和十六进制之间可以四位四位地转换
01011000 01011000 01011000 的十六进制就是 ( 58 ) 16 (58)_{16} (58)16 了
那么 [ 10 , 15 ] [10, 15] [10,15] 怎么表示呢
我们用 A A A 表示 10 10 10, B B B 表示 11 11 11 , 依此类推, F F F 表示 15 15 15
[ 10 , 15 ] [10, 15] [10,15] 怎么表示呢
我们用 A A A 表示 10 10 10, B B B 表示 11 11 11 , 依此类推, F F F 表示 15 15 15