- 论坛徽章:
- 0
|
这个应该是由体系架构决定的。以前我做过类似的测试,在同一台机器(比如Power服务器)上,无论使用哪种OS(AIX/Linux),哪种编译器(xl C/gcc),出来的结果一样。
现在手头只有AIX + xl C/C++编译器的环境,把结果贴出来。(程序我略微改了下)- #include <iostream>
- int main(int argc,char * argv[])
- {
- union
- {
- unsigned char c;
- struct Tag
- {
- unsigned char a:2;
- unsigned char b:4;
- unsigned char c:2;
- } m_tag;
- }tag;
- tag.c=0xA3;//10100011
- std::cout<<int(tag.m_tag.a)<<","<<int(tag.m_tag.b)<<","<<int(tag.m_tag.c)<<std::endl;
-
- return 0;
- }
复制代码 [shiyb /home/shiyb/test/bitfield] $ xlC test1.cpp
[shiyb /home/shiyb/test/bitfield] $ ./a.out
2,8,3
在我的AMD64 虚拟机 + SLES11 + gcc 上,上述程序的结果为:
shiyb@SLES1:~/test/bitfield> g++ test1.cpp
shiyb@SLES1:~/test/bitfield> ./a.out
3,8,2
从上面的情况可以看出,在同一个字节内部,对于bitfield来说,大端序和小端序的影响也是不可忽视的。
因此,考虑到跨平台的问题,在不是非常必要时,我一般不在涉及到不同机器间通讯的数据结构中使用bitfield。
在使用时,一个需要特别强调的事情是:千万别让 bitfield跨字节边界,否则,处理起来非常麻烦。 |
|