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

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

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

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

1 \times 2^{3}+1\times 2^{2}+1\times 2^{1}+1\times2^{0}=15

位宽为 w bits,表示的无符号数范围为 [0, 2^{w}-1]。

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

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

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

\\0101=0\times(-2^{3})+1\times2^{2}+0\times2^{1}+1\times2^{0}=5 \\1000=1\times(-2^{3})+1\times2^{2}+0\times2^{1}+1\times2^{0}=-8 \\1101=1\times(-2^{3})+1\times2^{2}+0\times2^{1}+1\times2^{0}=-3 \\1111=1\times(-2^{3})+1\times2^{2}+0\times2^{1}+1\times2^{0}=-1

4bits位宽的补码能表达的最大整数为7,最小整数为-8。因此,位宽为 w bits 的补码能表示的最大整数为2^{w-1}-1,最小整数为-2^{w-1}。这时候再看下面这张表是不是明白很多了。

3、无符号整型加法

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

\\09 = 1001 \\13=1101 \\09+13=1001+1101=10110

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

\\0\leq x,y\leq 2^{w}-1 \\ \\x+y=\left\{\begin{matrix} x+y & 0\leq x+y \leq 2^{w}-1\\ x+y-2^{w}& 2^{w}\leq x+y< 2^{w+1} \end{matrix}\right

4、有符号整型加法

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

\\-8 = 1000 \\-7=1001 \\-8+(-7)=1000+1001=10001(-15)

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

\\-2^{w-1}\leq x,y \leq 2^{w-1}-1 \\ \\x+y=\left \{\begin{matrix} x+y-2^{w-1} & 2^{w-1}-1<x+y<2^{w}-2\\ x+y & -2^{w-1}\leq x+y \leq 2^{w-1}-1\\ x+y+2^{w} & -2^{w}\leq x+y <-2^{w-1} \end{matrix}

5、优雅的表示浮点数

IEEE浮点标准用V=(-1)^{s}\times M \times 2^{E}的形式表示一个小数:

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为常数,bias = 2^{k-1}-1。单精度与双精度的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附近:

\\frac=11 \\exp=110 \\E=exp-bias=6-3=3 \\M=frac+1=1.11 \\V=\pm1.11\times 2^{3} = \pm1110=\pm14

猜你喜欢

转载自blog.csdn.net/zhong_ethan/article/details/102458735
今日推荐