搜索
bottom↓
回复: 11

位域和大小端问题,我的理解和网上的都不一样,大家看看

[复制链接]

出0入0汤圆

发表于 2015-6-25 21:19:02 | 显示全部楼层 |阅读模式
这是我自己的测试程序:有一个结构体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来反美的!

出0入4汤圆

发表于 2015-6-25 21:49:48 | 显示全部楼层
你理解的和测试的都是对的。你查的网上的是错的。

出0入0汤圆

发表于 2015-6-25 21:55:29 | 显示全部楼层
我只知道有个字节序的东西 是按bit顺序颠倒的,还没听过大小端不同,bit顺序不一样

出0入442汤圆

发表于 2015-6-25 22:34:29 | 显示全部楼层
如果你做过FPGA之类的,就会更清晰的理解大小端了。通常分为两个序:字节序和比特序。前者一般在总线上使用,后者一般在串行信号上使用。

出0入0汤圆

 楼主| 发表于 2015-6-25 22:40:55 | 显示全部楼层
wye11083 发表于 2015-6-25 22:34
如果你做过FPGA之类的,就会更清晰的理解大小端了。通常分为两个序:字节序和比特序。前者一般在总线上使用 ...

FPGA我以前玩过一段时间,但是没接触过你说的这些,我只是对自己的测试和网上的资料不一致而疑惑,我一直怀疑是自己的理解有问题,但是不知道问题在哪里。

出0入0汤圆

发表于 2015-6-25 22:48:44 | 显示全部楼层
wye11083 发表于 2015-6-25 22:34
如果你做过FPGA之类的,就会更清晰的理解大小端了。通常分为两个序:字节序和比特序。前者一般在总线上使用 ...

是的,如果用过FPGA就知道大小端不只是字节序不一样,比特序也是不一样的.

出0入0汤圆

 楼主| 发表于 2015-6-26 08:15:06 | 显示全部楼层
hyz_avr 发表于 2015-6-25 22:48
是的,如果用过FPGA就知道大小端不只是字节序不一样,比特序也是不一样的.

假设你说的是对的,那么我上面的测试和你说的就不一样,问题出在哪里?

出0入0汤圆

 楼主| 发表于 2015-6-26 12:37:53 | 显示全部楼层
谁能解答我的疑问。。。

出0入0汤圆

发表于 2017-7-14 10:36:59 | 显示全部楼层
大小端只有字节序不同,
位序不同的话,是更细分的分支了。
楼主看此贴:看2楼的文件

出0入296汤圆

发表于 2017-7-14 17:43:51 | 显示全部楼层
严格来说,大小端应该是纯粹的位序差异,但你听说过有个奇葩的东西叫BE8么?
简单说,基本上你看到的系统都是BE8,也就是保证字节内位序为小端,但是字节
顺序是大端的系统。

在真正的大端,而不是BE8系统中,字节内位序也是反的。这里水很深的。并不简单
只有大端和小端两种——应该说,小端很干脆,就一种,大端有很多玩法的。如果不怕
头疼,就看看这个资料:

https://en.wikipedia.org/wiki/Endianness

看百度,毁人生。

出0入296汤圆

发表于 2017-7-14 17:44:15 | 显示全部楼层
WM_CH 发表于 2017-7-14 10:36
大小端只有字节序不同,
位序不同的话,是更细分的分支了。
楼主看此贴:看2楼的文件

不要乱下结论。你这是误人子弟。

出0入0汤圆

发表于 2017-7-14 22:14:05 | 显示全部楼层
工程上的东西千万不要教条
位域的顺序在字节内跟大小端无关或者是有关这个不同的人会有不同的理解
如果标准里有这个,那就按标准的来,如果标准里没有,
那不同的编译器有可能处理的并不相同
实际上就算标准里有的东西都有可能不同的编译器并不相同

这个我觉得甚至并不能叫对错

这些东西别太去深究,浪费时间
知道实际上是怎么回事就差不多了

回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-27 03:19

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表