数的表示 —— 原码,反码,补码,移码 (个人学习笔记)

数的表示

各种i数值在计算机中表示的形式称为机器数,其特点是采用二进制计数制,数的符号用0和1表示,小数点则隐含,表示不占位置。
机器数对应的实际数值称为数的真值。
机器数有无符号数和带符号数之分。无符号数表示正数,在机器数中没有符号位。对于无符号数,若约定小i数点的位置在机器数的最低位之后,则是纯整数;若约定小数点的位置在机器数的最高位之前,则是纯小数。
机器数的最高位是表示正负的符号位,0表示正数,1表示负数,其余位表示数值。

为了方便运算,带符号的机器数可采用原码、反码、补码、移码等不同的编码方法,机器数的这些编码方法称为码制。

原码,反码,补码,移码之间的关系

正数的原码,反码,补码一样,移码在补码的基础上改变符号位(即符号为之前为正,则改为负,反之亦然)。
负数:反码是在原码的基础上,符号位不变,其它位取反(如果原码为1001,则反码为1110)。
补码是在反码的基础上加1(如果反码为1110,则补码为1111)

移码在补码的基础上符号位取反。

  • 原码表示法

数值X的原码记为【X】原 ,如果机器字长为n(即采用n个二进制位表示数),则原码的定义如下:
若X是纯整数,则【X】原 = {X 0 <= X <= 2^(n-1) -1
{2^(n-1) + |X| -(2 ^(n-1)-1) <= X <= 0
若X是纯小数,则【X】原 = {X 0 <= X < 1
{2^0 + |X| -1< X <= 0
在原码表示法中,最高位是符号位,0表示正号,1表示负号,其余的n-1位表示数值的绝对值。

  • 反码表示法

数值X的反码记作【X】反 ,如果机器字长为n,则反码的定义如下:
若X是纯整数,则【X】反 = {X 0 <= X <= 2^(n-1) -1
{2^n -1 + X -(2 ^(n-1)-1) <= X <= 0
若X是纯小数,则【X】反 = {X 0 <= X < 1
{2^0 + |X| -1< X <= 0
在反码表示中,最高位是符号位,0表示正号,1表示负号,正数的反码与原码相同,负数的反码则是其绝对值按位求反。数值0的反码表示有两种形式:【+0】反 =0 0000000,【-0】反 =1 1111111。

  • 补码表示法

数值X的补码记作【X】补,如果机器字长为n,则补码的定义如下:
若X是纯整数,则【X】补 = {X 0 <= X <= 2^(n-1) -1
{2^n + X -(2 ^(n-1)) <= X <= 0
若X是纯小数,则【X】补 = {X 0 <= X < 1
{2 + X -1< X <= 0
在补码表示中,最高位为符号位,0表示正号,1表示负号,正数的补码和其原码与反码相同,负数的补码则是在反码的末位加1。在补码表示中,0有唯一的编码:【+0】补 = 0 0000000 ,【-0】补 = 00000000

  • 移码表示法
    移码表示法是在数X上增加一个偏移量来定义,常用于浮点数中的阶码 如果字长为n,规定偏移量为2^n-1 ,则移码的定义如下:
    若X是纯整数,则【X】移 = 2^n-1 + X(-2 ^ n-1) <= X < 2 ^ n-1
    若X是纯小数,则【X】移 = 1 + X(-1 <= X < 1)

定点数和浮点数

  • 定点数
    所谓定点数,就是小数点的位置固定不变的数。小数点的位置通常有两种约定方式:定点整数(纯整数,小数点在最低有效数值位之后)和定点小数(纯小数,小数点在最高有效数值位之前)。
  • 浮点数
    当机器字长为n时,定点数的补码和移码可表示2^n 个数,而其原码和反码只能表示(2 ^ n)-1个数(0的表示占用了两个编码),因此,定点数所能表示的数值范围比较小,在运算中很容易因结果超出范围而溢出。浮点数是小数点位置不固定的数,它能表示更大范围的数。
    二进制可以表示为:2^5 * 0.101110101 或 2^6 * 0.0101110101 由此可知,一个二进制数N可以表示为更一般的形式 N = 2^E * F ,其中E为阶码,F称为尾数。用解码和尾数表示的数称为浮点数,这种表示数的方法称为浮点表示法。
    一个数的浮点表示不是唯一的。当小数点的位置改变时,阶码也随着相应改变,因此可以用多个浮点形式表示同一个数。

浮点数的规格化

浮点数都是近似表示的,精度都是以尾数决定的。为了提高精度,需要使尾数的有效位数尽可能占满可用位数,这种措施称为浮点数的规格化。
右规,尾数右移一位,阶码加一。
左规,尾数左移一位,阶码减一。

浮点数的运算

设有浮点数X= M * 2 ^ j ,求X + Y的运算过程要经过对阶、求尾数和、结果规格化并判溢出、舍入处理和溢出判别等步骤。

  1. 对阶。是两个数的阶码相同。令K = |i-j| ,把阶码小的数的尾数向右移动K位,并使阶码加上K。
  2. 求尾数和。
  3. 结果规格化并判溢出。如果运算结果所得的数不是规格化的数,则需要规格化处理。当尾数溢出时,需要调整阶码。
  4. 舍入处理。在对结果右规时,尾数的最低位将因为移出而丢掉。
  5. 溢出判别。以阶码为准,若阶码溢出,则运算结果溢出;若阶码下溢(小于最小值),则结果为0;否则结果正确,无溢出。

浮点数相乘,阶码相加,尾数相乘;浮点数相除,被除数的阶码减去除数的阶码,尾数相除。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值