低字节的高位和高字节的低位是不是连续的
Posted by Kai on October 9th, 2008
我今天才明白字节中的位的顺序,低位的地址在高位前面。这个看起来很容易的结论,我混淆了很久。
因为我们平时的微操作中,右移是变大,左移是变小,并且在用十六进制或者二进制表示一个数字的时候,都是高位在左边,低位在右边,所以我一直以为在一个字节里面,最低地址的位,是低7位,最高的是0.
比 如一个字节的大小是1,那么我以前的理解是在这个字节里面位的排列是(p)00000001(p+1)00000000,与二进制表示方法 B00000001一样。因为我平时画内存模型的时候,都是左边用小地址,右边是大地址,比如一个数组,4个元素,我会用||p|| p+1||p+2||p+3||。
今天看了一个MSDN上关于DTX5的编码格式的说明,里面提到了一个block里面的alpha数据的保存,
| Byte | Alpha |
|---|---|
| 0 | Alpha_0 |
| 1 | Alpha_1 |
| 2 | [0][2] (2 MSBs), [0][1], [0][0] |
| 3 | [1][1] (1 MSB), [1][0], [0][3], [0][2] (1 LSB) |
| 4 | [1][3], [1][2], [1][1] (2 LSBs) |
| 5 | [2][2] (2 MSBs), [2][1], [2][0] |
| 6 | [3][1] (1 MSB), [3][0], [2][3], [2][2] (1 LSB) |
| 7 | [3][3], [3][2], [3][1] (2 LSBs) |
顿时很奇怪,因为按照第[0][2]个像素的alpha数据有两个位是在第2个字节的高位,有1个位是在第3个字节的最低位。但是如果高位在左边的话,这两个存储就不是连续的。
为了确定高位到底是在哪边,于是我做了1个实验。
unsigned char B[2];
B[0] = (unsigned char)(0×80);
B[1] = (unsigned char)(0×01);
unsigned short S = *((unsigned short*)(B));
cout<<S<<endl;
低字节是B1000 0000, 高字节是B0000 0001, 合成的双字节如果是B0000 0001 1000 000那就说明低字节的高位和高字节的低位是连续的, 否则,如果合成的双字节是B0000 0001 0000 0001就表示不是连续的。
结果表明,低字节的高位和高字节的低位是连续的。
好像我自己说着说着有点乱了。。。。