计组学习——Number Representation
Number Representation
数字的表示方式
有符号数的表示
-
原码,把第一位数字表示为符号位,
如果000表示0,001表示为1,101表示-1,这样就会发现有两个可以表示0的量,分别是000和100。
这种情况下最大可以表示的数字是011...1,为\(2^{n-1}-1\)
由于值域完全对称,所以可以表示的最小值为 \(-(2^{n-1}-1)\)
正数的加法是可行的,只是位数看起来十分奇怪
负数的加法是不可行的
-
移码 Biased Notation
也就是给所有数字一个偏差,比如我们用000表示-3,001表示-2,010表示-1,011表示0,最终我们可以表示到111为4
可以表示的最小的值为\(-(2^{n-1}-1)\)
可以表示的最大的值为\(2^{n-1}\)
两个东西相加,会把偏移值多加一次
而且0不完全是0,很不方便,违反了平时的使用习惯
-
反码 One's Complement
我们采取镜像对称的方式合成
000 001 010 011 对称轴 100 101 110 111 0 1 2 3 对称轴 -3 -2 -1 -0 同样的,我们有两个0
最小的数为\(-(2^{n-1}-1)\)
最大的数为\(2^{n-1}-1\)
如果最高位加法有溢出,计算十分的复杂,所以现在已经不被使用
-
补码 Two's Complement
负数在反码的基础上值域再-1就变成了补码
00 001 010 011 对称轴 100 101 110 111 0 1 2 3 对称轴 -4 -3 -2 -1 如果我们想取一个负数的补码,那么我们可以先取这个数的正值,之后各个位取反最后再+1
同样的,对于一个二进制的补码,我们可以取反,再加一,将所得的数在十进制下添一个负号就是我们这个补码表示到十进制数。
而且可以很容易发现,补码满足加法的规律,并且很方便
可以表示的最大数为\(2^{n-1}-1\)
可以表示的最小的数为\(-2^{n-1}\)
对于补码来说,正数+负数是不会出现溢出现象的!就算进位超出了自己本来的已经拥有的位数,也不会影响运算结果!
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