有符号数无符号数加法以及浮点数表示

写在前面:计算机中数据存储与运算的专业名词听起来晦涩,实际上我们在九年义务教育阶段就已经掌握了,如:整型(integer)——整数,浮点数(float)——小数,无符号数(unsigned)——正数,有符号数(signed)——负数,把这种关系记在脑中,学起来就不那么怕了。

1、无符号整型表示(正数表示)

我们在纸上写一个数字,可以把数字写的无限大,但在计算机中不可以。数据在计算机中的表示有位宽(bits)要求,这是由于寄存器或存储单元有位宽限制,常见的位宽有8bits(字节),16bits(半字),32bits(字),64bits(双字),甚至有128bits。正因为如此,我们使用C语言定义整型变量时,需要考虑变量是short,int,long或是long long。假设位宽为4bits,则能表示最小的数为(0000),最大的数为(1111):

有符号数无符号数加法以及浮点数表示

位宽为 w bits,表示的无符号数范围为 [0, 有符号数无符号数加法以及浮点数表示]。

2、有符号数整型表示(负数表示)

有符号数在计算机中有多种标准表达方式:补码,反码和原码。本文主要介绍补码编码方式

在补码中,数据的最高有效位为负权,先看下面例子:

有符号数无符号数加法以及浮点数表示

4bits位宽的补码能表达的最大整数为7,最小整数为-8。因此,位宽为 w bits 的补码能表示的最大整数为有符号数无符号数加法以及浮点数表示,最小整数为有符号数无符号数加法以及浮点数表示。这时候再看下面这张表是不是明白很多了。

有符号数无符号数加法以及浮点数表示

3、无符号整型加法

4+9=13,在这个运算中,4和9都是一位整数,13是两位整数,两个一位整数相加得到两位整数,这在计算机中称为溢出。在计算机中,四位位宽数据相加只能得到四位位宽数据。看下面例子:

有符号数无符号数加法以及浮点数表示

假设计算机位宽为4bits,则上面的计算结果应舍去最高位,只保留后四位,得到结果6(0110)。对于位宽为w的数据,我们得到以下结论:

有符号数无符号数加法以及浮点数表示

4、有符号整型加法

4bits位宽补码能表示的数据范围为[-8,7],任意两数相加得到的值范围为[-16,14],其中,[-16,-9]并上[8,14]都是溢出的值,计算机无法表达,那计算机如何计算呢?看如下例子:

有符号数无符号数加法以及浮点数表示

假设计算机位宽为4bits,上面公式计算结果只能保留后四位0001=1。因此,在位宽为4bits的计算机中,-8+(-7)=1。值虽然不对,但并不会报错。对于位宽为w的数据,有如下结论:

有符号数无符号数加法以及浮点数表示

5、优雅的表示浮点数

IEEE浮点标准用有符号数无符号数加法以及浮点数表示的形式表示一个小数:

S表示符号,位数为1,s=1表示负数,s=0表示正数;

M表示尾数,位数用k表示,是二进制小数,取值范围为[0,1),或者[1,2);

E表示阶码,位数用n表示,作用是对浮点数进行加权。

单精度与双精度的位数如下图所示:

有符号数无符号数加法以及浮点数表示

采用此种方法编码的数根据exp的值可分为三种:非规格化(exp值全为0),规格化(exp值非全0和非全1),无穷大以及NaN(exp值全为1)。

(1)规格化

这类情况下,阶码值 E=exp-bias,bias为常数,有符号数无符号数加法以及浮点数表示。单精度与双精度的exp值范围分别为(0,255),(0,2047)。bias值分别为127,1023,得到阶码值E的取值范围分别为[-126,127],[-1022,1023]。

尾数M=f+1。其中 f 取值范围为[0,1)。 因此M的取值范围为[1,2)。

规格化的数据没法表达0附近的数据,因此需要非规格化的数据。

(2)非规格化

这类情况下,阶码值 E = 1- bias,M=f。非规格化的值与规格化的值平滑对接,可以表达0附近的值,包括-0和+0。

(3)特殊值

当阶码全为1,f=0时,表示无穷大。f != 0 时,表示NaN。

举个例子:6位格式的浮点数,阶码位数k=3,尾数尾数n=2。此时bias=3,能表达的规格化数范围为[-14,14],非规格化数在0附近:

有符号数无符号数加法以及浮点数表示

有符号数无符号数加法以及浮点数表示