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

一,概念

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


待续……




原文地址:https://www.cnblogs.com/huiqin/p/3674855.html