在计算机中有两种数据:
- 定点数:小数点的位置固定,包括顶点整数和定点小数
- 浮点数:小数点的位置不固定,由指数,基数和阶层组成,科学计数法
定点数:
- 无符号数
- 有符号数:原码、反码、补码、移码
无符号数
概念:整个机器字长的全部二进制位均为数值位,没有符号位,相当于数的绝对值
unsigned int n;
n的无符号数表示范围为:2的n次方-1(根据等差数列求和可知)
CARE:无符号数只能来修饰无符号整数,不能修饰无符号小数
有符号数
分别定点小数和定点整数
- 定点整数:定点在数值之后
- 定点小数:定点在符号位之后
表示:符号位 + 数值部分
即整数位权
小数位权
原码
概念:用尾数表示真值的绝对值,符号位“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只有一种表示方式
表示范围:表示范围和补码相同
运算
移位运算
算术移位
原码的算术移位:符号位保持不变,仅对数值位进行移位
右移
CARE:高位补0的同时,低位舍弃。若舍弃的位=0,相当于除以2,若舍弃的位!=0,则会丢失精度,比如20/8 = 2
左移
低位补0,高位舍弃。若舍弃的等于0,乘以2,;若舍弃不等于0,则会出现严重失误
反码:正数同原码,负数高低位补1
补码:
正数同原码
负数:补码= 反码末位+1,导致反码最右边几个连续的1都因进位而变为0,直到进位到第一个0为止
规律:负数补码中,最右边的1及其右边同原码,最右边的1的左边同反码
- 左移(同反码):高位补1,低位舍弃
- 右移(同原码):低位补0,高位舍弃
逻辑移位
- 右移:高位补0,低位舍弃
- 左移:低位补0,高位舍弃
可以看做是对“无符号数”的算数移位
循环移位
当进行左移或右移的时候,移除的放到缺失的位
带进位位的情况下(溢出),系统自动声明一块空间用于存放溢出的部分,循环移位的时候他即为循环位