无符号数与有符号数

计算机只能存储0和1,存储正整数非常简单,二进制的机器数代表真值即可,这就是无符号数。

有符号数取最高位为符号位。例如:最高位为0代表正数,最高位为1代表负数。

负数的存储解决了,但是如何存储小数呢?为了解决这个问题,则有了定点数与浮点数。定点数和浮点数都是有符号数。

定点数

存储整数时默认小数点在数值部分后面,这就是定点整数。存储小数时默认小数点在数值部分前面,这就是定点小数。
image.png

定点数的概念虽然给出了负数和小数存储问题的框架,但还有一些问题需要用不同的编码来解决。

原码

原码即最高位为0代表正数,最高位为1代表负数。其他位代表数值,非常简单易懂。

但是原码有一个问题,来计算一下1+(-1),先转化为二进制。

0000 0001
1000 0001
---------
1000 0010

结果为-2。结果明显是错的。

应该先根据最高位判断用加法还是减法,如果是减法则需要做减法。

用原码需要为CPU增加减法的电路。能否找到一个与这个负数等价的正数来代替这个负数来做加法?

补码

有一块表是十点钟,想调成8点钟又几种方法?

第一种方法是逆时针转2个小时,即10-2=8,第二种方法是顺时针转10个小时,即10+10=8。
image.png

当数A减数B,与数A加数C是等价的,我们就说C是B的补码。为什么有这种现象?因为时钟是模12的。计算机是模2^{n+1}的。所以计算机也可以用加补码代替减法。

补码的计算:

  1. 对于整数,补码与原码相同。
  2. 对于负数,符号位不变,数值部分按位取反,末位加1.(此规则同样适用于补码求原码)

例如:1001
第一位1不变,其他位按位取反得1110,在加1,得1111.

移码

补码虽然解决了负数表示的问题,但是其最高位1表示负数,0表示整数,这就造成负数的机器数比整数的机器数大,所以比较两个数大小还要先判断正负,我们可以用0表示负数,用1表示正数,这样比较两个数大小直接比较机器数的大小就可以了。

在数轴上相当于向右平移了2^n个长度。

浮点数

定点数存在几个问题:1.只能存储纯整数或纯小数。2.表示的数据范围有限。

浮点数可以弥补定点数的不足,顾名思义浮点数的小数点可以浮动,将真值N写成科学计数法的形式:

N = S \times r^{j}

其中S为尾数,j为阶码,r是基数(通常为2)。若要存储N,只需用一个定点小数存储S,再用一个定点整数存储j
image.png

为了提高浮点数的精度,其尾数必须为规格化数:尾数的最高数位必须是一个有效值。若尾数不是规格化数,需要调整尾数和阶码,使其成为规格化数,这个过程成为规格化。

IEEE 754 标准

现代计算机中浮点数采用IEEE 754 标准,形式如下:

image.png
因为浮点数必须规格化,尾数的最高数位必须是1,所以IEEE 754 标准中省略了这一位,称为隐藏位。

类型 数符 阶码 尾数数值 总位数 偏置值十六进制 偏置值十进制
短浮点数 1 8 23 32 7FH 127
长浮点数 1 11 52 64 3FFH 1023
临时浮点数 1 15 64 80 3FFFH 16383

c语言中数据类型

c语言中数据类型 类型 编码
int 定点数 补码
unsigned int 定点数 原码
float、double 浮点数 阶数用移码,尾数用原码
posted @ 2020-09-01 13:40:41
评论加载中...

发表评论