补码
明明我们用正数用的更多,如果把0归到负数里面,那么正数就是整的2n次方了。
为什么不这么做呢?
如果你的手表快了20分钟,你可以:
1.把他调慢20分钟
2.再调快11小时40分钟
其实负数就是一个特别大的正数。CPU没有做出来减法这种电路。
所有的减法都是加上这个数的负数,然后用溢出来完成的。
并且使用这种方法储存数据,不需要把符号位单独拿出来算。只要跟着右边的比特一起算加法就行了。
因此,0只能划分到较小的正数那一块了。
二进制计数
计算机储存数字是以二进制方式储存的。
二进制的数字要么0,要么1。两个1加起来就会向前进位变成10。
列个表可以直观一点看出来
- | - | - | - | - | - | - | - | - | - |
---|---|---|---|---|---|---|---|---|---|
00000000(00) | 00000001(01) | 00000010(02) | 00000011(03) | 00000100(04) | 00000101(05) | 00000110(06) | 00000111(07) | 00001000(08) | 00001001(09) |
00001010(10) | 00001011(11) | 00001100(12) | 00001101(13) | 00001110(14) | 00001111(15) | 00010000(16) | 00010001(17) | 00010010(18) | 00010011(19) |
00010100(20) | 00010101(21) | 00010110(22) | 00010111(23) | 00011000(24) | 00011001(25) | 00011010(26) | 00011011(27) | 00011100(28) | 00011101(29) |
00011110(30) | 00011111(31) | 00100000(32) | 00100001(33) | 00100010(34) | 00100011(35) | 00100100(36) | 00100101(37) | 00100110(38) | 00100111(39) |
00101000(40) | 00101001(41) | 00101010(42) | 00101011(43) | 00101100(44) | 00101101(45) | 00101110(46) | 00101111(47) | 00110000(48) | 00110001(49) |
00110010(50) | 00110011(51) | 00110100(52) | 00110101(53) | 00110110(54) | 00110111(55) | 00111000(56) | 00111001(57) | 00111010(58) | 00111011(59) |
00111100(60) | 00111101(61) | 00111110(62) | 00111111(63) | 01000000(64) | 01000001(65) | 01000010(66) | 01000011(67) | 01000100(68) | 01000101(69) |
01000110(70) | 01000111(71) | 01001000(72) | 01001001(73) | 01001010(74) | 01001011(75) | 01001100(76) | 01001101(77) | 01001110(78) | 01001111(79) |
01010000(80) | 01010001(81) | 01010010(82) | 01010011(83) | 01010100(84) | 01010101(85) | 01010110(86) | 01010111(87) | 01011000(88) | 01011001(89) |
01011010(90) | 01011011(91) | 01011100(92) | 01011101(93) | 01011110(94) | 01011111(95) | 01100000(96) | 01100001(97) | 01100010(98) | 01100011(99) |
位逻辑运算
位与
左 | 右 | 输出 |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1(只有两个数都是1时才输出1) |
34位与21的结果是
原数 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
---|---|---|---|---|---|---|---|---|
37 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 1 |
21 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 1 |
5 | 0 | 0 | 0 | 0 | 0 | 1(都为1) | 0 | 1(都为1) |
位或
逻辑与,是对每个比特进行一次与运算
左 | 右 | 输出 |
---|---|---|
0 | 0 | 0 |
0 | 1(只要有1就输出1) | 1 |
1(只要有1就输出1) | 0 | 1 |
1(只要有1就输出1) | 1 | 1 |
34位或21的结果是
原数 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
---|---|---|---|---|---|---|---|---|
37 | 0 | 0 | 1(有1就输出1) | 0 | 0 | 1(有1就输出1) | 0 | 1(有1就输出1) |
21 | 0 | 0 | 0 | 1(有1就输出1) | 0 | 1 | 0 | 1 |
53 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 |
异或
左 | 右 | 输出 |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1(两数不同输出1) |
1 | 0 | 1(两数不同输出1) |
1 | 1 | 0 |
34位或21的结果是
原数 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
---|---|---|---|---|---|---|---|---|
37 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 1 |
21 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 1 |
48 | 0 | 0 | 1(两数不同) | 1(两数不同) | 0 | 0 | 0 | 0 |
反码
输入 | 输出 |
---|---|
0 | 1(和输入不同) |
1 | 0(和输入不同) |
37的反码是
原数 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
---|---|---|---|---|---|---|---|---|
37 | 0(正数) | 0 | 1 | 0 | 0 | 1 | 0 | 1 |
-38 | 1(负数) | 1 | 0 | 1 | 1 | 0 | 1 | 0 |
全1的情况会被认为是-1。
而全0却会被认为是0。
所以一个数反码后绝对值会差1。
基本运算
加法
两个数字类型相加,和我们直接列竖式计算是一样的。
计算37+17,从上面的表找到对应的数字。
原数 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
---|---|---|---|---|---|---|---|---|
37 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 1 |
17 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 |
进位 | - | - | - | - | - | - | 1 | - |
54 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 0 |
加法自己身上的数,使用异或算法:两者不同则为1。
进位的数使用与算法:都为1才进位。
所以异或又称为不进位的加法。
减法
CPU没有算减法的指令,减法是计算加上他的负数完成的。
54-17,首先把17-1再进行反码
原数 | 8(符号位) | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
---|---|---|---|---|---|---|---|---|
17 | 0(正数) | 0 | 0 | 1 | 0 | 0 | 0 | 1 |
-17 | 1(负数) | 1 | 1 | 0 | 1 | 1 | 1 | 1 |
17这个负数,是和数字的最大值(全1)差16的数字。
进行相加后,
原数 | 9(溢出) | 8(符号位) | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
---|---|---|---|---|---|---|---|---|---|
54 | - | 0(正数) | 0 | 1 | 1 | 0 | 1 | 1 | 0 |
-17 | - | 1(负数) | 1 | 1 | 0 | 1 | 1 | 1 | 1 |
进位 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | - | - |
37 | 1(舍去) | 0(正数) | 0 | 1 | 0 | 0 | 1 | 0 | 1 |
位移运算
位移运算就是把整个数字向一边挪。
不够的补0,溢出的舍去。
原数 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 |
---|---|---|---|---|---|---|---|---|---|---|---|
37 | - | - | - | 0(正数) | 0 | 1 | 0 | 0 | 1 | 0 | 1 |
4 | 0(正数) | 0 | 0 | 0 | 0 | 1 | 0 | 0 | - | - | - |