在计算机中有两种数据:

  • 定点数:小数点的位置固定,包括顶点整数和定点小数
  • 浮点数:小数点的位置不固定,由指数,基数和阶层组成,科学计数法

定点数:

  • 无符号数
  • 有符号数:原码、反码、补码、移码

无符号数

概念:整个机器字长的全部二进制位均为数值位,没有符号位,相当于数的绝对值

unsigned int n;

n的无符号数表示范围为:2的n次方-1(根据等差数列求和可知)

CARE:无符号数只能来修饰无符号整数,不能修饰无符号小数

有符号数

分别定点小数和定点整数

  • 定点整数:定点在数值之后
  • 定点小数:定点在符号位之后

表示:符号位 + 数值部分
定点数及其原码、反码、补码、移码及其运算_反码
即整数位权
定点数及其原码、反码、补码、移码及其运算_无符号数_02
小数位权
定点数及其原码、反码、补码、移码及其运算_补码_03

原码

概念:用尾数表示真值的绝对值,符号位“0 / 1”对应“正 / 负”
如+19D(D表示是十进制数据),则用原码表示应该为

00010011
第一位用作符号位

公式:假设有n + 1位,原码整数的表示范围是

-(2^n-1)<= x <= (2^n-1)
关于原点对称

公式:假设有n + 1位,原码小数的表示范围是

-(1- 2^-n)<= x <= (1- 2^-n)
关于原点对称

CARE:真值0有+0和-0两种表示方法

1,0000000
0,0000000

反码

若符号位为0(正数),则反码和原码相同
若符号位为1(负数),则数值位全部取反

其他公式和真值0和原码相同

补码

正数的补码 = 原码
负数的补码 = 反码末位+1

CARE:补码的真值0只有一个

+0:0,0000000 不变
-0(原码):1,0000000 反码末位进1
-0(反码):1,1111111
-0(补码):10,0000000 此时会溢出,因此舍弃最前面的1,变成了0,0000000,与+0相同

表示范围
整数

-2^n <= x <= (2^n-1)

小数

-1 <= x <= (1- 2^-n)

作用:
使用补码可将减法操作转变成等价的加法,ALU中无需集成减法器,执行加法操作时,符号位一起参与运算,如

88-66 = 88 + (-66)
+88:0,1011000
-66:1,1000010
-66(反码):1,0111101
-66(补码):1,0111110
88 + (-66) = 01011000 + 10111110 = 100010110
取后面八位:00010110
转换成二进制:16 + 4 + 2 = 22

移码

补码的基础上将符号位取反

CARE:

  • 移码只能用于整数
  • 真值0只有一种表示方式

表示范围:表示范围和补码相同

运算

移位运算

算术移位

原码的算术移位:符号位保持不变,仅对数值位进行移位

右移
定点数及其原码、反码、补码、移码及其运算_其他_04
CARE:高位补0的同时,低位舍弃。若舍弃的位=0,相当于除以2,若舍弃的位!=0,则会丢失精度,比如20/8 = 2

左移
定点数及其原码、反码、补码、移码及其运算_其他_05

低位补0,高位舍弃。若舍弃的等于0,乘以2,;若舍弃不等于0,则会出现严重失误

反码:正数同原码,负数高低位补1

补码:
正数同原码

负数:补码= 反码末位+1,导致反码最右边几个连续的1都因进位而变为0,直到进位到第一个0为止
规律:负数补码中,最右边的1及其右边同原码,最右边的1的左边同反码

  • 左移(同反码):高位补1,低位舍弃
  • 右移(同原码):低位补0,高位舍弃

定点数及其原码、反码、补码、移码及其运算_补码_06

逻辑移位
  • 右移:高位补0,低位舍弃
  • 左移:低位补0,高位舍弃

可以看做是对“无符号数”的算数移位

循环移位

当进行左移或右移的时候,移除的放到缺失的位
定点数及其原码、反码、补码、移码及其运算_无符号数_07

带进位位的情况下(溢出),系统自动声明一块空间用于存放溢出的部分,循环移位的时候他即为循环位
定点数及其原码、反码、补码、移码及其运算_其他_08