您的位置:首页 > 理论基础

深入理解计算机系统 第2章 信息的表示和处理

2012-12-01 19:45 771 查看
一,概念

1.计算机存储和处理以一概念二值信号表示的信息;

计算机使用8位二进制,即1字节(byte)做为最小的可寻址存储器单位。

2.字长(word size)

每台计算机都有一个字长,指明整数和指针数据的标称大小(nomial size)

字长决定了系统虚拟地址空间的最大的大小,例如一个字长为n位的机器,

其指针也为n个字长,指针所能访问的虚拟地址空间就是0~2^n-1(也就是指针的表示范围,无符号)

例如:现在用的32位字长的计算机,限制了虚拟地址空间为4G

3.字节顺序:

一个超过一个字节长的数据在存储器中各字节是如何排序的,

两种字节序:大端字节序和小端字节序

举例, 假设一个类型为int的变量x地址为0x100,也就是说地址表示式&x=0x100.

那么,x的四字节将被存储在ox100,0x101,0x102,0x103这4个连续的空间里

假设x的值为 0x12345678

大端法:数字的高位存在低地址,从低地址->高地址方向看跟日常书写一致

0x 100 101 102 103 // 地址 低-->高

--+----+----+----+----+----n

--| 12 | 34 | 56 | 78 |--- // 每个字节存放顺序

--+----+----+----+----+----

小端法:数字的高位存在高地址,看到的跟日常书写相反。

0x 100 101 102 103

--+----+----+----+----+----

--| 78 | 56 | 34 | 12 |---

--+----+----+----+----+----

4.移位运算:

C语言中有符号无符号数的左移都是在低位补0

C语言中对于无符号数的右移采用逻辑右移,也就是高位补0

有符号数一般采用算术右移,也就是高位用数原来的最低位(符号位)填充。

有符号数(16bits)0x1000 >> 3 = 0xF000

5.二进制数:

现在计算机一般采用补码表示数(有符号与无符号数)

对于n位无符号数X, X = X0*2^0 + X1*2^1 + ... + Xn-1*2^(n-1),

有符号数 X = -Xn-1*2^(n-1) + X0*2^0+...+Xn-2*2^(n-2)

6.有符号数与无符号数的转换

int sx;

unsigned ux = (unsigned)sx;

转换并没有改变位的实际存储位,只是对这个位模式进行不同的解释

sx = 0xFFFF FFFF = -1; 转换后 ux = 0xFFFF FFFFF = 2^32-1

7.扩展一个数字的位表示

short sx = -12345; // 0xcfc7

unsigned usx = sx; // 0xcfc7

int x = sx; // 0xFFFF CFC7 == -12345

unsigned ux = x; // 0xFFFF CFC7

unsigned uy = usx; // 0x0000 CFC7

unsigned uz = sx; // 直接对short转换 =0xFFFF CFC7 or 0x0000 CFC7 ??

注意下面两个转换过程结果不一样

a) sx --> (int)sx --> (unsigned int)sx

b) sx --> (unsigned short)sx --> (unsigned int)sx

unsigned uz = sx; // 是a类型转换结果是 0xFFFF CFC7

待续……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: