|
这是我自己的测试程序:有一个结构体struct s,里面有一个unsigned short(16位、两个字节)型的位段。可以看到re1和re2会合用一个字节(假设成为byte1),b1~b8会占用另一个字节(假设成为byte2),
那么我的疑问是:我理解的大下端只应该是字节之间的顺序不同,也就是大小端模式下,byte1和byte2的前后存放关系会不一样,但是byte1和byte2内部的位域的顺序是不应该改变的。接下来是我的测试。
struct s{
unsigned short re1:4;
unsigned short re2:4;
unsigned short b1:1;
unsigned short b2:1;
unsigned short b3:1;
unsigned short b4:1;
unsigned short b5:1;
unsigned short b6:1;
unsigned short b7:1;
unsigned short b8:1;
};
//将一个字节的二进制打印出来,高位在左边
void print_byte_bin(unsigned char *p)
{
unsigned char mask = 0x80;
for(int i = 0;i < 8;i++){
if((*p) & mask ){
printf("1");
}else{
printf("0");
}
mask >>= 1;
}
}
void main(void)
{
struct s s1 = {0} ;
s1.b8 = 1;
s1.re2 = 3;
s1.re1 = 2;
print_byte_bin(((unsigned char *)&s1)+1);//先打印高地址
print_byte_bin(((unsigned char *)&s1)+0);//再打印低地址
}
STM8(IAR)下运行: 0011001010000000 (左边为数据高位)
Linux(GCC)下运行:1000000000110010 (左边为数据高位)
将上面的结果用图画了一下,如下:
总结一下:我理解和测试的结果说明,无论是位域还是多字节的基本类型(如short、int等),大小端只存在字节与字节之间,而字节内部的位的顺序是不会随大小端的不同而不同的。
但是我在网上以关键字“位域 大小端”来搜索时,查到的资料几乎都是一样的,也就是大下端还会影响字节内位域的顺序,附上一片博客园的文章的地址,大家可以对比看一下,即使我是错的,我也想错的心服口服。
博文地址:http://www.cnblogs.com/chencheng/archive/2012/06/19/2554081.html |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!
|