打印位域出现的奇怪问题
- C/C++ code
#include <stdio.h>#include <string.h>struct abcd_st { unsigned int a : 11; unsigned int b : 2; unsigned int c : 2; unsigned int d : 1;};int main(int argc,char **argv) { struct abcd_st abcd; unsigned char *ptr = (unsigned char *)&abcd; memset(&abcd,0xFF,1); memset(((char *)&abcd) + 1,0xFB,1); printf("abcd: %X %X\n",ptr[0],ptr[1]); printf("a:%X,b:%X,c:%X,d:%X\n", abcd.a, abcd.b, abcd.c, abcd.d); return 0;}以上代码打印的结果是:
abcd: FF FB
a:3FF,b:3,c:3,d:1
但打印出来的c是错误的,应该为1才对,有谁能解释一下这种奇怪的现象吗?
[解决办法]
给个不同的值,希望lz能看出来:
abcd: FF 1B
a:3FF,b:3,c:0,d:0
对应的位与值列表
abcd: FF 1B
11111111 11011000
aaaaaaaa aaabbccd
[解决办法]
出错估计是:a是从第一个字节开始访问, b,c,d都是从第二个字节的首地址开始访问.
[解决办法]
c不是错误的
FFFB,如果读这块内存的值时,其实是倒过来的FB FF
如图:
1 11 11 011 11111111
|d| c| b| a|
[解决办法]
LZ是 大/小 字节序?
[解决办法]
结果没有错误
楼主要把 关于字节序(bigEndian & littleEndian)的知识看一下
[解决办法]
- C/C++ code
struct abcd_st { unsigned int a : 11; // unsigned int b : 2; // unsigned int c : 2; //小弟不明白,谁能给解释一下, 为什么用冒号,表示什么意思 unsigned int d : 1; //??}; memset(&abcd,0xFF,1);//这句怎么解释 memset(((char *)&abcd) + 1,0xFB,1); //