王嘉贝

导航

定点数

定点数的表示

根据小数点的位置是否确定可以在计算机中有俩种结构格式: 定点表示,浮点表示;

(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. 符号位和值位分别计算,符号位异或结果
  2. 分成高位部分积和低位部分积部分存放绝对值大于等与1的值
  3. 从低位部分及开始判断 如果为1,则部分及部分加上|X|然后>>1, 如果为0直接>>1;
  4. 重复3,判断n次

参考:
乘除法
定点整数乘除法

补码计算方法 - 普遍采用

加减法
  1. 补码直接相加,逢2进1

  2. 符号位参与运算,符号位进位要丢掉,结果符号位由运算结果算出来

  3. 丢弃溢出位,模运算Mod M(定点正数M=2^n+1,定点小数 M=2)

  4. 补码的运算结果为补码

    习题: 机器字长为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

  1. 大字长 -> 小字长 : 高位直接截断,地位直接赋值
  2. 小字长 -> 大字长 : 值位相等,符号位相等,高位添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    

posted on 2021-06-29 23:12  toBeGeek  阅读(796)  评论(0编辑  收藏  举报