读书笔记----第二章 信息的表示和处理

《第二章:信息的表示和处理》
一.基本概念
1.位bit(b):表示一个二进制数
2.字节:8比特的块,字节是最小的可寻址的存储器单位。
3.字:总线传送的字节块
4.字长:指CPU一次能并行处理的二进制位数,指明了整数和指针数据的标准大小,决定了虚拟地址空间最大大小,字长为32位的计算机的虚拟地址空间最大为4GB
5.虚拟存储器:虚拟存储器是对主存和磁盘I/O设备的抽象,存储器中每个字节都有一个唯一的数字来标识,成为它的地址,所有可能地址的集合成为虚拟地址空间。

二.进制表示及相互转换
(1)二进制
(2)八进制
(3)十六进制
(4)十进制

三.寻址和字节序
1.寻址
多字节对象被存储在连续的字节序列,对象使用的地址为所使用字节中最小的地址。
2.主机序:
不同的CPU有不同的字节序类型,这些字节序是指整数在内存中保存的顺序。最常见的有两种:
(1)大端机:最高有效位存储在低地址。
(2)小端机:最低有效位存储在低地址。
3.网络字节序
TCP/IP中规定的一种数据表示格式,其与具体的CPU类型、操作系统等无关,可以保证数据在不同主机之间传输时能够被正确的解释。网络字节序采用大端机的排序方式。

四.原码、反码、补码
1.机器数
一个数在计算机中的二进制表示形式,  叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1.
比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011。如果是 -3 ,就是 10000011 。那么,这里的 00000011 和 10000011 就是机器数。
2.真值
因为第一位是符号位,所以机器数的形式值就不等于真正的数值。例如上面的有符号数 10000011,其最高位1代表负,其真正数值是 -3 而不是形式值131(10000011转换成十进制等于131)。所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。
例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1
3.原码
最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。
4.反码
正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
5.补码
正数的补码与其原码相同;负数的补码是在其反码的末位加1

五.C语言中运算操作
1.布尔代数
(1)false - 0
(2)true - !0
2.逻辑运算
(1)与:&&
(2)或:||
(3)非:!
备注:如果前面的运算得出结果,后面的运算将不再继续
3.位运算
(1)按位与:&
按位与运算 按位与运算符"&"是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1 ,否则为0。参与运算的数以补码方式出现。
应用:
a. 清零特定位 (mask中特定位置0,其它位为1,s=s&mask)
b. 取某数中指定位 (mask中特定位置1,其它位为0,s=s&mask)
(2)按位或:|
按位或运算 按位或运算符“|”是双目运算符。其功能是参与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就为1。参与运算的两个数均以补码出现。
应用:
a.常用来将源操作数某些位置1,其它位不变。 (mask中特定位置1,其它位为0 s=s|mask)
(3)按位取反:~
求反运算 求反运算符~为单目运算符,具有右结合性。 其功能是对参与运算的数的各二进位按位求反。
(4)按位异或:^
按位异或运算 按位异或运算符“^”是双目运算符。其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。参与运算数仍以补码出现。
(5)左移:<<
左移运算符“<<”是双目运算符。其功能把“<< ”左边的运算数的各二进位全部左移若干位,由“<<”右边的数指定移动的位数, 高位丢弃,低位补0。 其值相当于乘2。例如: a<<4 指把a的各二进位向左移动4位。
例如a=00000011(十进制3),左移4位后为00110000(十进制48)
(6)右移:>>
右移运算符“>>”是双目运算符。其功能是把“>> ”左边的运算数的各二进位全部右移若干位,“>>”右边的数指定移动的位数。其值相当于除2。
例如:设 a=15,a>>2 表示把000001111右移为00000011(十进制3)。对于左边移出的空位,如果是正数则空位补0,若为负数,可能补0或补1,这取决于所用的计算机系统。移入0的叫逻辑右移,移入1的叫算术右移

六.字符串表示
C语言中字符串被编码为一个以NULL(其值为0)字符结尾的字符数组,每个字符由某种标准编码来表示,比如ASCII字符码、UTF-8,它的存储和字节顺序无关。

七.代码表示
对机器来说,程序仅仅只是字节序列,机器没有关于初始源程序的任何信息。

八.整数表示
1.无符号整数
整数在计算机中,以二进制比特位表示的。例如,对于一个w位的无符号整数,用二进制比特位可以表示为[xw-1 , xw-2 , … , x2 , x1 , x0],如果我们用B2Uw(x)来表示这个整数,其中B表示是binary,U表示是unsigned,w表示二进制比特的位数。那么可以得到,
clip_image002[4]
无符号整数的最大值和最小值:
clip_image004[4]
clip_image006[4]
2.有符号整数
计算机系统大都采用补码(two’s complement)来表示有符号数的。例如,对于一个w位的整数,用二进制比特位可以表示为[xw-1 , xw-2 , … , x2 , x1 , x0],那么比特位 xw-1就是符号位,如果值是0表示正整数,如果值是1则表示负整数。B2Tw(x)来表示整数,则有
clip_image008[4]
clip_image010[4]
从上面的公式可以看出,当xw-1 = 0时,

clip_image012[6]
 所能表示的最大整数是

clip_image014[4]
;当xw-1 = 1时,

clip_image012[7]
 所能表示的最小整数是

clip_image016[4]
。 W比特位的有符号数的值的范围是
clip_image018[6]
。从这里我们也可以出,

clip_image016[5]
 没有相反数,对它求绝对值,将会是0。
3.有符号数和无符号数转换
在c语言中,如果我们写出如下的代码:
(1)
short sx = -1;
unsigned short ux = sx;// 此时 ux的值是 65535
比特位:1111111111111111
(2)
unsigned short uy = 65534;
short sy = uy; //此时 sy 的值是-2
比特位:1111111111111110
(3)
unsigned short uz = 28;
short sz = uz; // 此时,sz也等于28
比特位:0000000000011100
备注:在计算机中,相同比特位可以解释为“有符号数”和“无符号数”,也就是可以相互转换的“有符号数”和“无符号数”他们的二进制表示是一样的,唯一不同的就是人们给他们了不同的解释。
用公式表示U2Tw(x)表示有符号数转换为无符号数,
clip_image021
用公式表示T2Uw(x)表示无符号数转换为有符号数,
clip_image023[4]
4.整数扩展
先看一个c语言的实例,
(1)
short sa = -13;
sa的比特位是:
clip_image025[4]
int ia = sa;
ia的比特位是:
clip_image027[4]
short sa1 = 13;
sa1的比特位是:
clip_image029[4]
int ia1 = sa1;
ia1的比特位是:
clip_image031[6]
总结:可以看出short到int的转换就是最高有效位向高位扩展了。
(2)
unsigned short usb = 13;
usb的比特位是:
clip_image029[5]
unsigned ub = usb;
ub的比特位是:
clip_image031[7]
unsigned short usb1 = 65532;
usb1的比特位是:
clip_image033[6]
unsigned ub1 = usb1;
ub1的比特位是:
clip_image035[4]
总结:可以看出unsigned short到unsigned int的转换就是0向高位扩展了。
结论:对于有符号整数,短类型向长类型转换,位模式采用符号扩展;对于无符号整数,长类型向短类型转换,位模式采用0扩展

5.整数截断
(1) 无符号数
unsigned ua = 123456;
unsigned short usa = ua;//此时usa等于多少呢?
(123456)10 =
clip_image037[4]
由于unsigned short是16位长,unsigned 是32位长,所以unsigned
向unsigned short转换,只能将高16位截断,留下低16位。相当于是模数为216 模运算。即,usa = ua % 216 = (1110001001000000)2
总结:对于比特位为w位的无符号整数x , 转换为比特位为k位的无符号整数x’ , 其中k < w。那么 x’= x % 2k ,通俗的讲,就是将高位的w-k位截掉。
(2) 有符号数
int ia = -2128464810;
short sa = ia;//此时ia等于多少呢?
(-2128464810)10 =
clip_image039[4]
由于short是16位长,int 是32位长,而我们只能用16位来表示,该怎么办呢?

办法是:
1、先对(-2128464810)10 和模数216 进行模运算(注意,曾经介绍过,c++中有符号整数的模运算的结果的符号类型和被除数的保持一致)。所以,(-2128464810)10 % 216 = -52138
2、余数-52138转换为比特位是16的无符号数,即13398
3、将无符号数13398转换为有符号数,他自身13398
总结:对于比特位为w位的符号整数x , 转换为比特位为k位的符号整数x’ , 其中k < w,过程如下:
1、求出 x % 2k , 结果记作r
2、将r转换为比特位为k的无符号数
3、将2中的结果转换为比特位为k的有符号数,即x’
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值