计算机存储和处理的信息都是以二进制进行表示。这章研究3种不同数字的表示,无符号数,有符号整数和浮点数。
- 无符号(unsigned int)是基于二进制表示法,表示大于或等于零的数字
- 有符号整数(int)是用补码来表示,可以为正或者为负的数
- 浮点数(float)由3个部分所组成,符号位,阶码和尾数
信息存储
大多数计算机使用8位的块(字节)作为最小的可寻址的存储器单元,虚拟存储器是一个非常大的字节数组,存储器的每个字节由唯一的数字标识,称为地址,所有地址的集合称为虚拟地址空间。
大端法:高位有效字节存储在低地址,符合人类认知
小端法:低位有效字节存储在低地址,目前大多数计算机使用小端法
例如:
int val = 0x87654321;
大端法存储为:
| 87 | 65 | 43 | 21 |
|---|
小端法存储为:
| 21 | 43 | 65 | 87 |
|---|
数据大小
| C声明 | 32位机器(byte) | 64位机器(byte) |
|---|---|---|
| char | 1 | 1 |
| short int | 2 | 2 |
| int | 4 | 4 |
| long int | 4 | 8 |
| long long int | 8 | 8 |
| char * | 4 | 8 |
| float | 4 | 4 |
| double | 8 | 8 |
在32位机器和64位机器中,只有long int 和char *这两种数据类型有不同的字节数,其余均相同。
强制类型转换中,并不会改变存储的数据,而是用不同的解释规则对数据进行解释。
位运算
位运算包括:与、或、非、异或、左移、右移。
与(&):全1为1,其余为0
或(|):全0为0,其余为1
非(~):1为0,0为1
异或(^):不同为1,相同为0
左移(<<):高位丢弃,低位补0
右移(>>):逻辑右移:低位丢弃,高位补0;算术右移:低位丢弃,高位补第一位值
逻辑运算:与(&&)、或(||)、非(!)。均返回boolean值。
无符号数
无符号数由二进制进行表示,有w位的无符号数[, , ..., , ],其十进制为: * + * + ... + * + *
例如:无符号数0b00001011 = 0 * + 0 * + 0 * + 0 * + 1 * + 0 * + 1 * + 1 * = 11
有符号数
有符号数用补码进行表示,其高位为负权重,及高位为 * (-),其余位数计算同无符号位。有w位的有符号数[, , ..., , ],其十进制为: * (-) + * + ... + * + *
例如:有符号数0b11111111 = 1 *(-)+ 1 * + 1 * + 1 * + 1 * + 1 * + 1 * + 1 * = -1
浮点数
浮点数分为单精度float和双精度double,浮点数由3部分组成,分别为高位符号位s,阶码exp和尾数frace。
单精度float
exp部分用来区别数据是规格化数,非规格化数还是特殊值。
单精度V的计算
计算公式:V = * M *
V为十进制值
S为符号位,s为0是正数,为1是负数
M与f相关,frace转成十进制的值 *
E与bias相关,bias = - 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表示无法转换为数字的值。
数的相加
无符号数相加,但凡溢出则是原结果 - ,w为无符号数的位数,为8。不溢出则为原结果。
例如:
unsigned char x = 255;
unsigned char y = 1;
则 x + y = 256 = 256 - = 0,则结果输出为0
有符号数的相加,其中溢出分为正溢出和负溢出
1.正溢出:x + y -
2.负溢出:x + y +