1. 关于计数系统(科普)
一个计数系统一共能表示多少个数,我把它叫做这个计数系统的容量,或者是叫做Mod。
举个栗子,一个只有时针的表盘,一共有12个刻度,所以可以认为这个计数系统一共有12个数,所以这个计数系统的容量是12,或是叫做这个计数系统的Mod = 12 。
再举个栗子,一个4bit的存储空间,它一共能表示2的4次方个数(即16个),所以这个计数系统的Mod = 16 。
2.关于数字溢出(科普)
如果一个数超出了一个计数系统的表示范围,我把它叫做溢出了。
举个栗子,如果现在是13点,那时针肯定不能指向13,因为表盘上就没有这个数字,所以这时候,13这个数溢出了,那么溢出之后的结果, 现在时针指向了1 (其实就是 13%12 = 1 )。
再举个栗子,一个4bit的存储空间,假设它表示的是无符号整形,那么它表示的是 0-15 ,那么17这个数肯定会溢出, 溢出之后的结果是 17%16 = 1, 具体对照如下:
0000 = 0 1111 = 15
0001 = 1 1110 = 14
0010 = 2 1101 = 13
0011 = 3 1100 = 12
0100 = 4 1011 = 11
0101 = 5 1010 = 10
0110 = 6 1001 = 9
0111 = 7 1000 = 8
3.关于计数系统的形象直觉
计数系统的形象直觉就是一个逐步加一,周期性变换的一个首尾相连的环儿。
举个栗子,现在是表盘上时针指向7,那么3个小时之后指针指向了( 7+3 = 10 ),8个小时之后,时针指向了 (7+8)= 15,因为15溢出了,那么时针应该指向了(15%12 = 3)
4.关于加减法
a+b可以认为是在a的基础上前进b步,a-b可以认为是在a的基础上后退b步,而如果一个计数系统的容量记为Mod,后退b步其实等价于前进Mod-b步。
举例说明,钟表:
1)5 + 6 = 11
2)11+3 = 14, 14%12 = 2
3)5 - 3 = 5 + (-3)= 5 + (12 - 3)= 14, 14%12 = 2
4)5 - 7 = 5 + (-7)= 5 + (12 - 7)= 10
5.关于正负号
我们先来规定一个叫做补数的东西,如果 a > 0, a 的补数为a, 如果 a < 0, a的补数为 Mod + a。
举例说明,4个bit的存储空间, 数字 -> 补数 -> 二进制表示 对照表:
0000 = 0 <- 0 -1 -> 15 = 1111
0001 = 1 <- 1 -2 -> 14 = 1110
0010 = 2 <- 2 -3 -> 13 = 1101
0011 = 3 <- 3 -4 -> 12 = 1100
0100 = 4 <- 4 -5 -> 11 = 1011
0101 = 5 <- 5 -6 -> 10 = 1010
0110 = 6 <- 6 -7 -> 9 = 1001
0111 = 7 <- 7 -8 -> 8 = 1000
分8个情况具体分析一下:
1) x > 0, y > 0, x + y < 7, 这个是最一般的情况,不多说
2) x > 0, y > 0, x + y > 7, 此时二进制运算结果正常,十进制运算结果溢出
十进制 4 + 5
二进制 = 0100 + 0101
二进制 = 1001
十进制 = -7
3) x > 0, y < 0, x + y > 0, 此时二进制运算结果溢出,十进制运算结果正常
十进制 -4 + 5
二进制 = 1100 + 0101
二进制 = 0001
十进制 = 1
4)x > 0, y < 0, x + y < 0, 此时二进制运算结果正常,十进制运算结果正常
十进制 4 + (-5)
二进制 = 0100 + 1011
二进制 = 1111
十进制 = -1
5) x < 0, y < 0, x + y > -8, 此时二进制运算结果溢出,十进制运算结果正常
十进制 -2 + (-5)
二进制 = 1110 + 1011
二进制 = 1001
十进制 = -7
6)x < 0, y < 0, x + y < -8, 此时二进制运算结果溢出,十进制运算结果溢出
十进制 -4 + (-5)
二进制 = 1100 + 1011
二进制 = 0111
十进制 = 7
6.关于补码
其实5中的补数就是补码啦,只不过二进制中,证书的补码依然是它本身,而负数的补码最高位的1表示符号,其余位刚好是按位取反再加一啦~
7.补码的好处和精巧之处
1)减法运算可以用加法来实现,即用求和来代替求差。
2)数的符号位可以同数值部分作为一个整体参与运算。
概括一下就是,它实现了 两数的补码之和(差)=两数和(差)的补码
8. 反码
啥?反码?反码其实就是原码转补码的中间产物啦。。。洗洗睡吧。。。