位域和大小端问题,我的理解和网上的都不一样,大家看看
这是我自己的测试程序:有一个结构体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 你理解的和测试的都是对的。你查的网上的是错的。 我只知道有个字节序的东西 是按bit顺序颠倒的,还没听过大小端不同,bit顺序不一样 如果你做过FPGA之类的,就会更清晰的理解大小端了。通常分为两个序:字节序和比特序。前者一般在总线上使用,后者一般在串行信号上使用。 wye11083 发表于 2015-6-25 22:34
如果你做过FPGA之类的,就会更清晰的理解大小端了。通常分为两个序:字节序和比特序。前者一般在总线上使用 ...
FPGA我以前玩过一段时间,但是没接触过你说的这些,我只是对自己的测试和网上的资料不一致而疑惑,我一直怀疑是自己的理解有问题,但是不知道问题在哪里。 wye11083 发表于 2015-6-25 22:34
如果你做过FPGA之类的,就会更清晰的理解大小端了。通常分为两个序:字节序和比特序。前者一般在总线上使用 ...
是的,如果用过FPGA就知道大小端不只是字节序不一样,比特序也是不一样的. hyz_avr 发表于 2015-6-25 22:48
是的,如果用过FPGA就知道大小端不只是字节序不一样,比特序也是不一样的.
假设你说的是对的,那么我上面的测试和你说的就不一样,问题出在哪里? 谁能解答我的疑问。。。 大小端只有字节序不同,
位序不同的话,是更细分的分支了。
楼主看此贴:看2楼的文件
严格来说,大小端应该是纯粹的位序差异,但你听说过有个奇葩的东西叫BE8么?
简单说,基本上你看到的系统都是BE8,也就是保证字节内位序为小端,但是字节
顺序是大端的系统。
在真正的大端,而不是BE8系统中,字节内位序也是反的。这里水很深的。并不简单
只有大端和小端两种——应该说,小端很干脆,就一种,大端有很多玩法的。如果不怕
头疼,就看看这个资料:
https://en.wikipedia.org/wiki/Endianness
看百度,毁人生。 WM_CH 发表于 2017-7-14 10:36
大小端只有字节序不同,
位序不同的话,是更细分的分支了。
楼主看此贴:看2楼的文件
不要乱下结论。你这是误人子弟。 工程上的东西千万不要教条
位域的顺序在字节内跟大小端无关或者是有关这个不同的人会有不同的理解
如果标准里有这个,那就按标准的来,如果标准里没有,
那不同的编译器有可能处理的并不相同
实际上就算标准里有的东西都有可能不同的编译器并不相同
这个我觉得甚至并不能叫对错
这些东西别太去深究,浪费时间
知道实际上是怎么回事就差不多了
页:
[1]