原码-反码-补码,精巧的计数和运算设计

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. 反码

啥?反码?反码其实就是原码转补码的中间产物啦。。。洗洗睡吧。。。


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值