计算机中的数字


无符号数和有符号数

计算机中参与运算的数有两大类:无符号数和有符号数

无符号数

计算机中的数存放在寄存器中,寄存器的位数称为机器字长

无符号数即没有符号的数,寄存器中的每一位均可存放数值。寄存器的位数直接反映无符号数的表示范围。

有符号数

有符号数可以分为符号部分和数值部分

机器数和真值

  • 真值即带“+”或“-”符号的数
  • 机器数即把符号数字化后的数,用“0”表示“+”,用“1”表示“-”

注意:计算机中小数点的位置是以约定的方式给出的,没有任何硬件用来表示小数点,比如表示小数时,约定小数点的位置在符号位之后,表示整数时,约定小数点的位置在数值位的后面

原码表示法

定义

为了书写方便以及区别整数与小数,约定整数的符号位与数值位之间用逗号“,”隔开,小数的符号位与数值位之间用小数点“.”隔开,真实的计算机中是没有这些符号的,引用只是为了表述清楚

当x = +1110时,[x] = 0,1110;

当x = -1110时,[x] = 2^4 - (-1110) = 1,1110

当x = 0.1101时,[x] = 0.1101

当x = -0.1101时,[x] = 1 - (-0.1101) = 1.1101

注意:

整数时,能表示的最大正数是2^n - 1,最小负数是-2^n + 1

0有两种不同的表示方式,[+0.0000] = 0.0000,[-0.0000] = 1 - (-0.0000) = 1.0000

原码的特点是简单、直观,很容易与真值转换,但是用源码进行加减法时,如果两个数符号相同,数值部分直接相加,符号位不变,但是两个数符号不同时,实际上是减法运算,还要判断绝对值的大小,判断结果符号位,这导致运算步骤很复杂。我们需要对加减法做归一化,只用加法,这需要找到一个与负数等价的正数来代替负数,这便是补码

补码表示法

“补”的概念

如时钟指示6点,要让它指示3点,既可以逆时针拨3个小时,也可以顺时针拨9个小时,此时是15时,因为时钟是以12为模的(在时钟中,超过12无法显示,自动丢失),所以15-12=3,显示是3点,所以-3和+9对时钟而言作用是一致的,称+9是-3以12为模的补数。

结论:

  • 一个负数加上即得该负数的补数
  • 一个整数和一个负数互为补数,他们的绝对值之和为模数
  • 正数的补数为该正数本身

补码的定义

当 x = +1010时,[x]补 = 0,1010

当 x = - 1101时,[x]补 = 2^n+1 + x = 100000 - 1101 = 1,0011

当 x = 0.1001时,[x]补 = 0.1001

当 x = - 0.0110时,[x]补 = 2 + x = 10.0000 - 0.0110 = 1.1010

注意:

当x = 0时,[+0.0000]补 = 0.0000,[-0.0000]补 = 2 + x = 0.000,因为符号位只有一位,最高位的1被舍弃,符号位为0,因此补码中只有一种表示形式

对于小数,当x = -1 时,[x]补 = 2 + x = 1.0000,可见,-1本不属于小数范围,但却有[-1]补的形式存在

求补码的快捷方式

当真值为负时,补码可用原码除符号位外,每位取反,末尾加1求得

反码表示法

反码通常用来作为由原码求补码或者由补码求原码的中间过渡

定义

当x = +1101时,[x]反 = 0,1101

当x = - 1101时,[x]反 = (x^4+1) - 1 + x = 11111 - 1101 = 1,0010

当x = 0.0110时,[x]反 = 0.0110

当x = -0.0110时,[x]反 = (2 - 2^-4) + x = 1.1111 - 0.0110 = 1.1001

注意:

当x = 0 时,[+0.0000]反 = 0.0000,[-0.0000]反 = (10.0000 - 0.0001) - 0.0000 = 1.1111,因此反码中的“零”也有两种表示形式

三种机器数的特点

  • 最高位为符号位,书写上用“,”(整数)或“.”(小数)将符号位与数值位分开

  • 对于正数,原码 = 补码 = 反码

  • 对于负数, 符号位为1,其数值部分有如下关系:

    原码除符号位外每位取反,末位加 1, 即得补码

    原码除符号位外每位取反,即得反码

移码表示法

原因:补码表示符号位与数值位一起编码,很难直接判断其真值的大小

在计算机中符号位与数值位之间的“,”是不存在的,直接进行比较的话,会得出101011 > 010101,100001 > 011111,这与十进制的真值比较结果正好相反。

为了解决这种情况,将补码加上2^n,相当于在数轴上向右移动2^n个单位,这就是移码的由来。

定义

[x]移 = 2^n + x (2^n > x >= -2^n)

x为真值,n为整数的位数

小数没有移码

移码与补码的比较

设x = + 1100100,[x]移 = 2^7 + 1100100 = 1,1100100,[x]补 = 0,1100100

设x = -1100100,[x]移 = 2^7 - 1100100 = 0,0011100,[x]补 = 1,0011100

由此可见,补码与移码只差一个符号位

当整数的位数为n时,最小负数的移码是0,0的移码是2^n,最大整数的移码是(2^n+1) - 1,实际上就是将符号位算作数值位的无符号数。

数的定点表示和浮点表示

数的定点表示

小数点按约定的方式标出,有两种格式:

小数点位于数符和第一数值位之间时,机器内的数为纯小数,称为小数定点机,小数点位于数值位之后时,机器内的数为纯整数,称为整数定点机。

定点机中数的表示范围如下:

在定点机中,因为小数点的位置不变,因此当机器处理的数不是纯整数或者纯小数时,要乘上一个比例因子,不然会产生“溢出”

数的浮点表示

浮点数即小数点的位置可以浮动的数。

浮点数的一般形式

N = S * r^j,式中S为尾数(可正可负),j为阶码(可正可负),r是基数,在计算机中,基数可选2、4、8等

以基数为2为例,

N = 11.0101

​ = 0.110101 x 2^10

​ = 1.10101 x 2^1

​ = 1101.01 x 2^-10

​ = 0.00110101 x 2^100

为了提高数据的精度以及便于浮点数的比较,计算机中规定浮点数的尾数用纯小数形式,而且将尾数最高位为1的浮点数称为规格化数,浮点数表示成规格化数之后,精度最高。

  • 浮点数的表示形式

  • 浮点数的表示范围

当浮点数的阶码大于最大阶码时,称为上溢,此时计算机停止运算,济宁中断溢出处理;当浮点数的阶码小于最小阶码时,称为下溢,按机器零处理,机器继续运行。

  • 浮点数的规格化

    为了提高浮点数的精度,其尾数必须为规格化数,如果不是规格化数,要通过修改阶码并同时左右移尾数的方法,使其变为规格化数。

    规格化时,尾数左移一位,阶码减一,称为左规;尾数右移一位,阶码加1,称为右规

    一般来说,基数r越大,可表示的浮点数的范围越大,精度越低


文章作者: likai
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 likai !
评论
  目录