第二章 信息的处理和表示
2.1信息存储
1.三种数字的表示
无符号:编码基于传统的二进制表示法,表示大于或者等于零的数字。
补码:编码是表示有符号整数的最常见的方式,有 符号整数就是可以为正或者为负的数字。
浮点数:编码是表示实数的科学记数法 的以二为基数的版本。
2.寻址和字节顺序
小端法和大端法
小端法:最低有效字节在前面——“高对高,低对低”
大端法:最高有效字节在前面
3.逻辑运算和位运算
(1)逻辑运算符&& (与)||(或)!(非)
(2)位运算(按位布尔运算)所使用的符号&(AND)|(OR)~(NOT)^(EXCLUSIVE-OR)
掩码——用来选择性的屏蔽信号
掩码是一个位模式,表示从一个字中选出的位的集合。用位向量给集合编码,通过指定掩码来有选择的屏蔽或者不屏蔽一些信号,比如某一位位置上为1时,表明信号i是有效的;0表示该信号被屏蔽。
2.2整数表示
1.补码编码
补码的利用寄存器的长度是固定的特性简化数学运算。想想钟表,12-1 等价于 12 + 11,利用补码可以把数学运算统一成加法,只要一个加法器就可以实现所有的数学运算。
2.有符号数和无符号数的转换规则
无符号数:不存在正负之分,所有位都用来表示数的本身。 有符号数:最高位用来表示数的正负,最高位为1则表示负数,最高位为0则表示正数。 (1)无符号数转换为有符号数 看无符号数的最高位是否为1,如果不为1(即为0),则有符号数就直接等于无符号数;如果无符号数的最高位为1,则将无符号数取补码,得到的数就是有符号数。 (2)有符号数转换为无符号数 看有符号数的最高位是否为1,如果不为1(即为0),则无符号数就直接等于有符号数;如果有符号数的最高位为1,则将有符号数取补码,得到的数就是无符号数。
3.0扩展和符号扩展
扩展——从一个较小的数据类型转换为较大的数据类型,同时保持数值不变。
(1)符号扩展:当用更多的内存存储某一个有符号数时,由于符号位位于该数的第一位,扩展之后,符号位仍然需要位于第一位,所以,当扩展一个负数的时候需要将扩展的高位全赋为1;对于正数而言,符号扩展和零扩展是一样的,因为符号位就是0。
比如一个用一个8位二进制表示-1,则是10000001
如果把这个书用16位二进制表示时,则为11111111 10000001 高位全都是1,这个叫做符号扩展,主要用于对其操作数。
(2)零扩展就是全补零。不论其符号位是多少,高8位全都补0.
能过上面的定义可以看出在C++中,如果把一个char向一个整形转换的时候,就会存在着这个问题
如果你想得到一个正数,那么如果一个字符的ASCII码值是小于零的,而直接用(int)c进行强制类型转换,结果是通过符号扩展得到的也为一个负数。要得到正数,一定要用(int)(unsigned char)c;因为unsigned char去除了c的符号位,所以,这样的类型转换后,再用(int)进行转换得到的就是一个正数。
(3)从上机的叙述得知,有符号数向其它类型数据转化(如char到int,char到unsigned int)时,进行符号位扩展;无符号数向其它类型转换(如unsigned char到int, long)时,进行零扩展。
|
||||||||||||||||||
(4)由大数据类型向小数据类型转换时,保留低位字节。
unsigned long |
char |
保留低位字节 |
unsigned long |
short |
保留低位字节 |
2.3整数运算
1.关于整数运算的最后思考
计算机执行的“整数”运算实际上是一种运算模式。表示数字的有限字长限制了可能的值的取值范围,运算结果可能溢出。C语言中的某些规定可能会产生令人意想不到的结果,而这些可能是难以察觉和理解的缺陷的源头。
2.4浮点数
浮点表示对形如V=x*2y的有理数进行编码近似地表示实数。当一个数字不能被准确表示时,必须向下或向上调整,由此产生了舍入(rounding)。IEEE浮点格式定义了四种不同的舍入方式,默认方法是找到最接近的匹配,而其他三种可用于计算上界和下界。
遇到的问题:对运算的公式记忆比较差,需要把公式列在一边边看边做,不能独立离开公式做题,
以前的知识记得不够劳,容易记混记错。需要时常回去记忆之前的知识。。。。。。。
抱歉老师国庆出去玩了,这个博客现在才交,望老师原谅