第2章-信息的表示和处理

138 阅读3分钟

计算机存储和处理的信息都是以二进制进行表示。这章研究3种不同数字的表示,无符号数,有符号整数和浮点数。

  • 无符号(unsigned int)是基于二进制表示法,表示大于或等于零的数字
  • 有符号整数(int)是用补码来表示,可以为正或者为负的数
  • 浮点数(float)由3个部分所组成,符号位,阶码和尾数

信息存储

大多数计算机使用8位的块(字节)作为最小的可寻址的存储器单元,虚拟存储器是一个非常大的字节数组,存储器的每个字节由唯一的数字标识,称为地址,所有地址的集合称为虚拟地址空间。

大端法:高位有效字节存储在低地址,符合人类认知

小端法:低位有效字节存储在低地址,目前大多数计算机使用小端法

例如:

int val = 0x87654321;

大端法存储为:

87654321

小端法存储为:

21436587

数据大小

C声明32位机器(byte)64位机器(byte)
char11
short int22
int44
long int48
long long int88
char *48
float44
double88

在32位机器和64位机器中,只有long int 和char *这两种数据类型有不同的字节数,其余均相同。

强制类型转换中,并不会改变存储的数据,而是用不同的解释规则对数据进行解释。

位运算

位运算包括:与、或、非、异或、左移、右移。

与(&):全1为1,其余为0

或(|):全0为0,其余为1

非(~):1为0,0为1

异或(^):不同为1,相同为0

左移(<<):高位丢弃,低位补0

右移(>>):逻辑右移:低位丢弃,高位补0;算术右移:低位丢弃,高位补第一位值

逻辑运算:与(&&)、或(||)、非(!)。均返回boolean值。

无符号数

无符号数由二进制进行表示,有w位的无符号数[xw1x_{w-1}, xw2x_{w-2}, ..., x1x_1, x0x_0],其十进制为:xw1x_{w-1} * 2w12^{w-1} + xw2x_{w-2} * 2w22^{w-2} + ... + x1x_1 * 212^1 + x0x_0 * 202^0

例如:无符号数0b00001011 = 0 * 272^7 + 0 * 262^6 + 0 * 252^5 + 0 * 242^4 + 1 * 232^3 + 0 * 222^2 + 1 * 212^1 + 1 * 202^0 = 11

有符号数

有符号数用补码进行表示,其高位为负权重,及高位为xw1x_{w-1} * (-2w12^{w-1}),其余位数计算同无符号位。有w位的有符号数[xw1x_{w-1}, xw2x_{w-2}, ..., x1x_1, x0x_0],其十进制为:xw1x_{w-1} * (-2w12^{w-1}) + xw2x_{w-2} * 2w22^{w-2} + ... + x1x_1 * 212^1 + x0x_0 * 202^0

例如:有符号数0b11111111 = 1 *(-272^7)+ 1 * 262^6 + 1 * 252^5 + 1 * 242^4 + 1 * 232^3 + 1 * 222^2 + 1 * 212^1 + 1 * 202^0 = -1

浮点数

浮点数分为单精度float和双精度double,浮点数由3部分组成,分别为高位符号位s,阶码exp和尾数frace。

单精度float

exp部分用来区别数据是规格化数,非规格化数还是特殊值。

单精度V的计算

计算公式:V = (1)s(-1)^s * M * 2E2^E

V为十进制值

S为符号位,s为0是正数,为1是负数

M与f相关,frace转成十进制的值 * 2(尾数f的位数1)2^{- (尾数f的位数-1)}

E与bias相关,bias = 2(阶码e的位数1)2^{(阶码e的位数-1)} - 1

1.Normalized

bias = 27 - 1 = 127

E = e - bias

M = 1 + f

2.Denormalized

Denormalized可以表示两种类型值,分别为浮点数的0和非常接近0的数。

2.1浮点数的0

当s = 0,M = f = 0,V = +0.0

当s = 1,M = f = 0,V = -0.0

IEEE规范规定,0有正0和负0,当1/+0 = +∞,1/-0 = -∞。

2.2非常接近0的数

E = 1 - bias = 1 - 127 = - 126

M = f

3.Infinity

当s = 0,f = 0,V = +∞

当s = 1,f = 0,V = -∞

4.NaN

NaN表示无法转换为数字的值。

数的相加

无符号数相加,但凡溢出则是原结果 - 2w2^w,w为无符号数的位数,为8。不溢出则为原结果。

例如:

unsigned char x = 255;

unsigned char y = 1;

则 x + y = 256 = 256 - 282^8 = 0,则结果输出为0

有符号数的相加,其中溢出分为正溢出和负溢出

1.正溢出:x + y - 2w2^w

2.负溢出:x + y + 2w2^w