学习过程:
第二章信息的表示和处理
一、数字表示
1、 无符号数:编码基于传统的二进制表示法表示大于或等于零的数字。
2、 补码:编码是表示有符号整数的最常见方法,可以是正或者是负的数字。
3、 浮点数:编码是表示实数的科学计数法的以二位基数的版本。
二、信息存储
1、进制:二进制、八进制、十进制、十六进制(转换:以二进制作为中间变量)
2、使用C99特性时 gcc -std=c99 xxx.c 实验楼环境为64位,编译为32位机器码: gcc -m32 xxx.c
gcc -m32 可以在64位机上(比如实验楼的环境)生成32位的代码
3、字长:指明整数和指针数据的大小。
字长决定最重要的系统参数就是虚拟地址空间的最大大小。
4、字节顺序:字节顺序是网络编程的基础。
5、小端法:某些机器选择在存储器中按最低有效字节到最高有效字节。
大端法:某些机器选择在存储器中按最高有效字节到最低有效字节。
小端是“高对高、低对低”,大端与之相反。
6、所有逻辑运算都可以用与、或、非表达(最大式、最小式),而与或非可以用“与非”或“或非”表达,所以,只要一个与非门,就可以完成所有的逻辑运算。
7、布尔代数:二进制是计算机编码、存储、操作信息的核心。
逻辑运算——0或1
8、表示字符串:文本数据比二进制数据具有更强的独立性
9、掩码:通过指定一个位向量掩码,有选择的使能或不能屏蔽一些信号。(0表示被屏蔽)
掩码是位运算的重要应用,对特定位可以置一,可以清零。
三、整数表示
1、整型数据类型:根据字节分配,不同的大小所能表示的值的范围不同。
最高位有效位也称符号位。0为正,1为负。
要用C99中的“long long”类型,编译是要用 gcc -std=c99
2、扩展一个数字的位表示:在不同字长的整数之间转换又保持数值不变。
3、符号扩展:将补码数字转换成更大类型的数据。规则在表中添加最高有效位的值的副本。
4、无符号数与有符号数转换
强制类型转换的结果保持位值不变,改变解释这些位的方式。
处理同样字长的有、无符号数之间相互转换的规则:数值可能会变,但是位模式不变。(底层的位表示保持不变)
无—>有:U2Tw函数
有—>无:T2Uw函数(w表示数据类型的位数。)
5、扩展一个数字的位表示:在不同字长的整数之间转换又保持数值不变。
0扩展:简单的在表示的开头加0。
符号扩展:将补码数字转换成更大类型的数据。规则在表中添加最高的效位的值的副本。
6、截断数字:可能会改变数值——溢出的一种形式。
对于无符号数字x,截断到k位,相当于计算:x mod 2(k)。(k次幂)
四、整数运算
1、整数运算:整数运算实际是一种模运算。表示数字的有限字长限制了可能的取值范围,结果可能溢出。补码提供了技能表示正数也能表示负数的灵活方法,同时使用了与执行无符号算数相同的位级实现。
2、补码:最常见的有符号数的计算机表示方式。
最高有效位也叫符号位。
3、正数的补码=原码
负数的补码=原码各位取反后加1
4、补码的利用寄存器的长度是固定的特性简化数学运算。利用补码可以把数学运算统一成加法,只要一个加法器就可以实现所有的数学运算。
5、C语言中有符号数和无符号数的转换规则,位向量不变。
五、浮点数
1、二进制小数:小数点左边的数字的权是2的非负幂,右边的数字的权是2的负幂。
2、IEEE浮点表示:标准 V=(-1)^sM2^E
(符号:s决定这个数是负数(s = 1)还是正数(s = 0),而对于数值0的符号位解释作为特殊情况处理。
尾数:M是一个二进制小数,它的范围是1 ~ 2-ε,或者是0 ~ 1-ε。
阶码:E的作用是对浮点数据加权,这个权重是2的E次幂。)
3、将浮点数的位表示划分为三个字段分别进行编码:
一个单独的符号位直接编码符号。
k位的阶码字段exp = ek-1…e1e0编码阶码。
n位小数字段,但编码出来的值也依赖于阶码字段的值是否等于0。
4、舍入:浮点运算只能近似的表示示数运算想要找到最接近x的值就是舍入,问题的关键在于在两个可能的值中间确定舍入方向。
向偶数舍入:也叫向最接近的值舍入。是默认方法。将数字向上或向下舍入使的结果的最低有效数字是偶数。
5、浮点运算:IEEE的优势可以独立于任何具体的硬件或软件实现。
浮点加法不具有结合性但满足了单调性属性。
6、C语言中的单精度浮点格式float 和双精度浮点格式double:在float中,s字段为1位、exp字段k = 8 位、frac字段n = 23位,得到一个32位的表示;在double中,s字 段为1位、exp字段k = 11 位、frac字段n = 52位,得到一个64位的表示。