一,概念
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
待续……