计组学习01——Number Rep

计组学习——Number Representation

Number Representation

数字的表示方式

有符号数的表示

  • 原码,把第一位数字表示为符号位,

    ​ 如果000表示0,001表示为1,101表示-1,这样就会发现有两个可以表示0的量,分别是000和100。

    ​ 这种情况下最大可以表示的数字是011...1,为2n11

    ​ 由于值域完全对称,所以可以表示的最小值为 (2n11)

    ​ 正数的加法是可行的,只是位数看起来十分奇怪

    ​ 负数的加法是不可行的

  • 移码 Biased Notation

    也就是给所有数字一个偏差,比如我们用000表示-3,001表示-2,010表示-1,011表示0,最终我们可以表示到111为4

    可以表示的最小的值为(2n11)

    可以表示的最大的值为2n1

    两个东西相加,会把偏移值多加一次

    而且0不完全是0,很不方便,违反了平时的使用习惯

  • 反码 One's Complement

    我们采取镜像对称的方式合成

    000 001 010 011 对称轴 100 101 110 111
    0 1 2 3 对称轴 -3 -2 -1 -0

    同样的,我们有两个0

    最小的数为(2n11)

    最大的数为2n11

    如果最高位加法有溢出,计算十分的复杂,所以现在已经不被使用

  • 补码 Two's Complement

    负数在反码的基础上值域再-1就变成了补码

    00 001 010 011 对称轴 100 101 110 111
    0 1 2 3 对称轴 -4 -3 -2 -1

    如果我们想取一个负数的补码,那么我们可以先取这个数的正值,之后各个位取反最后再+1

    同样的,对于一个二进制的补码,我们可以取反,再加一,将所得的数在十进制下添一个负号就是我们这个补码表示到十进制数。

    而且可以很容易发现,补码满足加法的规律,并且很方便

    可以表示的最大数为2n11

    可以表示的最小的数为2n1

    对于补码来说,正数+负数是不会出现溢出现象的!就算进位超出了自己本来的已经拥有的位数,也不会影响运算结果!

Numbers Overflow

如果我们采用 补码Two's Complement 表示,可以从上述表格中看出来,3再+1就可以变成-4。

由此可以得到,在最大的数字加上一些数字可以变成最小的数字

有时我们可以利用这种溢出,来进行哈希

Sign Extension

MSB(Most Significant Bit) 最高有效位,LSB最低有效位

如果想要用更多的位来表示同一个数字,

  • 对于正数来说,很容易,只需要添加更多的前导0
  • 对于负数,取决于表示方式
    • 原码(Sign and magnitude):0b11 = 0b 1001
    • One's/Two's complement: 0b11 = 0b 1111

img

posted @   ZzTzZ  阅读(55)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示