数据位+解释可以定义数据,第二章主要介绍信息的存储、整数、浮点数的相关内容。
浮点数溢出将会成为正无穷大。
2.1 信息存储
(2.1.2 字、2.1.3 数据大小、2.1.4 寻址和字节顺序、2.1.5 表示字符串、2.1.6表示代码、2.1.7 布尔代数和环、2.1.8 C中的位运算逻辑运算位移)
1. 八个位(bit)组合成块成为字节(byte),作为最小的可寻址存储单位。
2. 单个字节的表示范围为 0~255(10进制整数),00 ~ FF (16进制),也就是说,十六进制一个字符表示4个bit。
3. 每台计算机会有字长(word size)概念,指明整数和指针的标称大小(nominal size),过去主要为32位,现在大部分是64位,也就是8字节。
4. 大小端(big endian little endian)的区别在于存储一个数据(字长,如int 0x12345678)时,地址从低到高,大端按字节从高到低,小端按字节从低到高存储。
5. 大小端目前涉及两个地方需要注意:A. 跨机器网络通信,需要转网络序或统一。 B. 阅读汇编或底层字节,主要注意大小端。
6. 通常我们使用 unsigned char * 作为指向字节的指针描述,声明每个字节都是一个非负正数。
7. 围绕二进制演化出的布尔代数,包含“与或非”三类主要运算,以及异或。
8. 环:<集合、运算符、单位元>,例如整数集合<Z,+,x,-,0,1>,布尔代数<{0,1},|,&,~,0,1 >
9. C语言在逻辑运算符中存在阻断特性,p&&*p++不会导致引用空指针。
2.2 整数的表示
1. 一个64位整数,最大值是2147483647,也就是21亿,无符号的话也就是42亿。
2. 为了让计算机支持带符号数的计算(减法),提出了反码和补码的概念。
3. 由于数字位表示及C语言中强转的特殊性,需要特别注意无符号整数(特别是在与有符号数的运算中)以及位移(位移操作在补位时存在一定规律而非完全补0)
4. 无符号整数在连续相加后会溢出,而有符号整数会出现正溢出和负溢出。
(这里可能比较难理解,举个栗子,在补码加法中,8+2=-6为正溢出,-2+-8=6为负溢出)
3. 浮点数
1. 如同十进制的小数是分为整数、小数部分,并且分别用10的n次幂来表示每个位置的值(n为整数而非正整数)。
2. 在计算机中的浮点数,采用2的n次幂(n为整数),每个位置为0、1表示,这样,采用x(y/z)的形式来不断逼近浮点数的目标值。
3. 举个栗子,计算机使用浮点数表示 1/5,近似值可以为 0.00110011(2次幂),即为 51/256 等于 0.19921875。
4. 关于浮点数的一个简单例子,在传统IA32处理器中,寄存器中可以保存扩展精度的浮点数(80位),因此,当出现寄存器和内存中双精度的浮点数比较时,就可能出现误差,总而导致不相等的情况。(O2优化开启时)