【考研】计组 (二): 数据的表示和运算
凌晨九点 Lv2

经过做题的实践发现,对于原码、补码、移码等运算除了掌握计算机基本的运算规则以外还有一些共性的规律,利用这些规律可以更快速的解题,将我总结的规律记录如下。

一、定点数编码解题技巧

1.0 一些常识

  • 28=2562^8 = 256
  • 216=655362^{16} = 65536
  • 8位数最大表示为 2712^7 - 1,计算机中始终从0位开始数
  • 相同位数的补码和移码表示的数据范围相同

1.1 补码的规律

一个8位的数用补码表示其表示范围是 272^{-7}2712^{7} - 1

思考方式:补码不对称,0将正数的一个位置占了,因此正数少一个, 同时 77 位最多表示 272^7 个数,应此得到这个结果

一个8位的负数通过补码计算真值的时候如果这个数除符号位的部分容易确定大小,可以直接用公式 (28m)-(2^8 - m) 得到结果,其中mm 是这个正数。

思考方式: 这个实际上是补码的定义,有时候比化成反码再算要快

补码的数值变化规律: 实际上是两个递增的一次函数,其中断点在00 处, 在单调区间内可以直接比较大小

思考方式: 别想了,容易倒腾乱

有符号数和无符号数的转化关系,具体例子如下

1
2
3
short a = -32767;
unsigned short b = a;
printf("%d\n", b);

对于这个问题求解为 $b = 2^{16} - |a| $

思考方法: $ a = 2^{15} - |m|$ , 同时 b=215+mb = 2^{15} + |m| , 其中 mm 就是除最高位的表示数

1.2 移码的规律

偏移为127的移码