定点数
定点数的表示
根据小数点的位置是否确定可以在计算机中有俩种结构格式: 定点表示,浮点表示;
(1) 定点小数(纯小数): 小数点位置在最高位之前
假设机器字长32bit,定点小数可以表示的最大的数
-(1-2^-31) ~ (1-2^-31) , 包括0在内部
(2) 定点整数: 小数点位置在最低为之后
2^31-1 最大, -2^31-1
下方的n表示的除了符号位剩下的机器字长
例如32位字长,n=31
数字 | +定点小数 | -定点小数 | +定点整数 | -定点整数 |
---|---|---|---|---|
原码 | x | 1-x | x | 2^n - x |
反码 | x | (2-2^-n)+x | x | 2^(n+1) -1 + x |
补码 | x | 2+x | x | 2^n+1 + x |
移码 | - | - | 2^n +x | 2^n +x |
以下是具体案例:定点小数和定点整数
数字 | 0.1101 | -0.1101 | 1110 | -1110 |
---|---|---|---|---|
原码 | 01101000 | 11101000 | 00001110 | 10001110 |
反码 | 01101000 | 10010111 | 00001110 | 11110001 |
补码 | 01101000 | 10011000 | 00001110 | 11110010 |
移码 | - | - | 10001110 | 01110010 |
定点数的计算
算数移位 << >>
正数<< / >> 都是添加0
负数:
原码:符号位不变,都是添加0
反码: 符号位不变,都是添加1
补码:符号位不变,<<添0. >> 添1
逻辑移位 < >
无视符号位,左移高位丢失,地位添加0
右移,地位丢失,高位添0
原码的计算方法 - 只需了解
加减法
(1)先判断符号位,相同符号,则绝对值相加;符号位不变
(2)绝对值大的减去绝对值小的,符号等与绝对值大的一方
乘除法
- 符号位和值位分别计算,符号位异或结果
- 分成高位部分积和低位部分积部分存放绝对值大于等与1的值
- 从低位部分及开始判断 如果为1,则部分及部分加上|X|然后>>1, 如果为0直接>>1;
- 重复3,判断n次
补码计算方法 - 普遍采用
加减法
-
补码直接相加,逢2进1
-
符号位参与运算,符号位进位要丢掉,结果符号位由运算结果算出来
-
丢弃溢出位,模运算Mod M(定点正数M=2^n+1,定点小数 M=2)
-
补码的运算结果为补码
习题: 机器字长为8位,A=15, B=24, 求[A+B]补 以及 [A-B]补:
由上述学习内容易知:
A补=A原=00001111,B补=00011000
-B原=10011000,-B补=11101000;
因此:
[A+B]补 = (A补 + B补) Mod 2^8 = 00100111 -> 原码 = 1+2+4+32=39
[A-B]补 = (A补 + -B补) Mod 2^8 =11110111 -> 原码 = 1 000 1001=-8 -1=-9
类型转换
C/C++ 等语言可以使用强制的类型转换, static_case 等函数 或者 (new type)oldtype value
- 大字长 -> 小字长 : 高位直接截断,地位直接赋值
- 小字长 -> 大字长 : 值位相等,符号位相等,高位添0
储存与排列
数据的储存既可以从低位到高位储存,也可以从高位到低位储存;
大端方式 -> 先高位,后低位
小端方式 -> 先低位,后高位
排列方式: 边界对齐 边界不对齐
可以按照字,半字,字节寻址 半字地址一定是2的倍数,字地址一定是4的整倍数
不满足是填充空白字节。浪费了一些空间但是提高指令和取数效率
这是一种用空间换时间的效率
RISC如ARM 就是采用边界对齐的方式
CISC x86对齐和不对齐都支持,对齐方式取指令时间相同,更加适合流水线作业
深化理解练习题
定点小数的计算
假设[x]补 = 1.x1x2x3x4,当如何取值的时候,x的真值小于-1/2?
1. x1必须为1,剩下的至少一个为1;
2. x1必须为1,剩下的任意;
3. x1必须为0,剩下的至少一个为1;
4. x1必须为0,剩下的任意
解: 按照补码的定义 |x|绝对值= 2- 1.x1x2x3x4 >1/2 绝对值越大,值越小
0.1 > 0.x1x2x3x4 , x1必须为0 才可以保证小于1/2 即0.1
定点整数的计算:
假设[x]补=1,x1x2x3x4x5x6,其中的xi取0或者1;如果要x>-32那么应当满足:
1. x1=0; other: any
2. x1=1, other :any
3. x1=0, at least =1 ;
4. x1=1,at least =1 ;
根据补码的定义与换算 [x]补 = 2^7 - |X|;
所以|X|=1000 0000 -1x1x2 x3x4x5x6 根据题意 |X|小于32 负数X才能大于-32
|X|<32= 10 0000 ; 1000 0000 -1x1x2 x3x4x5x6 <10 0000
1x1x2x3x4x5x6> 110 0000 => x1x2x3x4x5x6 > 10 0000
x1 必须为1,剩下的至少有一个为1