信息表示与处理
这一章节的重要点是掌握数据在的存储形式,特别是浮点数的存储原理。
小端与大端表示法
小端表示法即将字节的低位保存到内存的低地址,字节的高位保存到内存的高地址
大端表示法则相反,字节的高位保存在内存的低地址
注意目前大多Intel机器都采用小端模式
字符串表示
注意C语言字符串是ASCII编码,而ASCII编码具有平台独立性,因为其字节顺序一定,始终是从地位地址开始存起
逻辑运算与位运算
逻辑运算符:||,&&,!
位运算:|,&
移位运算:>>
不要把逻辑运算与位运算弄混,
注意a<<b,当该操作数b为负或大于等于左操作数宽度时行为是未定义的
整数编码
- 原码:原码是符号数+其余位表示数
- 比如-2:10000010
- 反码:正数同原码,负数符号位不变,其余位取反
- 补码:正数同原码,负数符号以外的位数取反加一
浮点数
IEEE浮点数表示
V = (-1)^s x M x 2^E
s符号是负数标志位
M尾数是二进制小数
E是阶码
以float格式为例
[30-31]位就为负数标志位,当其为一的时候就表示其为负数;[23-30]就是表示浮点数的阶码;[0-22]是表示浮点数的尾数,其具体的解释关系见下文
可以看到其正负数辨别方式与补码不同
规格数与非规格数
浮点数表示有三种解释形式
- 一是规格化形式,对于该形式的解释方式如下
s : (-1)s
E: E = e - Bias
M: M = 1+f
- 另一种是非规格化形式
S: (-1)s
E: E = 1 - Bias
M: M = f
- 还有一种是特殊值形式
特殊值形式是当阶码全为1或小数域全为0的形式
之所以会分为三种解释形式是为了能够使得数值的增加能够自然过渡
浮点数的精度取决于尾数的位数,数值范围取决于阶码的位数
指数位小,NaN更多,所以其能表示的实数值就更少了
舍入
向偶数舍入是默认方式
强制类型转换规则
-
从int转换为float:因为float能表示的数字范围大于int,所以不会溢出,但因为float有一定的精度限制,所以可能被舍入
-
int,float转换为double:因为double有更大的范围以及很高的精度,所以不会发生溢出也不会发生舍入
-
float,double转Int:值可能会向0舍入
-
int,float转换为double:因为double有更大的范围以及很高的精度,所以不会发生溢出也不会发生舍入
-
float,double转Int:值可能会向0舍入