内存大小端

举报
用户已注销 发表于 2021/11/19 04:09:40 2021/11/19
1.2k+ 0 0
【摘要】 目录 一,大端Big_endian、小端Little_endian 二,字节大小端 1,int 2,结构体 三,比特大小端 四,总结 一,大端Big_endian、小端Little_endian 大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这和我们的阅读习惯一致。 小端模式,是...

目录

一,大端Big_endian、小端Little_endian

二,字节大小端

1,int

2,结构体

三,比特大小端

四,总结


一,大端Big_endian、小端Little_endian

大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这和我们的阅读习惯一致。

小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中。

大小端的问题,主要有2个颗粒度,一个是字节,一个是比特。

二,字节大小端

当一个数据有n(n>1)个字节组成时,我们才需要考虑大小端,如果所有数据都是一个字节的大小,就没有大小端了。

一个字节的数据以char为代表,而n(n>1)个字节的数据以int这种原子数据为代表,结构体这种复合数据不涉及字节大小端。

在用指针转换来完成大小端实测之前,首先我们要知道:

无论大小端,也无论是int还是结构体类型的指针,指针指向的那个字节都是所有字节中最低的那个

1,int

代码:


      #include <stdio.h>
      int main()
      {
         int a=257;
         char *p=(char *)&a;
         printf("%d %d %d %d",*p, *(p+1),*(p+2),*(p+3));
         return 0;
      }
  
 

输出:1 1 0 0

很明显,这是小端,个人PC默认是小端。

如果是大端环境,输出的就是0 0 1 1了

2,结构体

代码:


      #include <stdio.h>
      typedef struct Node
      {
         int a;
         int b;
      }Node;
      int main()
      {
          Node s;
          s.a=1,s.b=257;
         char *p=(char *)&s;
         for(int i=0;i<8;i++)printf("%d ",*(p+i));
         return 0;
      }
  
 

输出:1 0 0 0 1 1 0 0

如果是大端环境,输出的就是1 1 0 0 1 0 0 0

也就是说,结构体内各成员的顺序就是自然顺序,没有大小端之分,但是成员内部还是按照成员本身的规则安排。

因为结构体可以嵌套结构体,所以我上面这句话其实也是个递归式的论述。

三,比特大小端

当使用位域时,我们需要考虑字节内各比特位的排列顺序,即比特大小端。

在网上找到一个示例:


      struct Node{
         int a:1;
         int b:2;
         int c:3;
         int d:4;
         int e:5;
         int f:6;
         int g:11;
      };
  
 

大端:
数据:abbcccdd ddeeeeef fffffggg gggggggg
小端:
数据:ddcccbba feeeeedd gggfffff gggggggg

同样的,我用小端机器输出试了下:


      #include <stdio.h>
      typedef struct Node
      {
         int a:1;
         int b:2;
         int c:29;
      }Node;
      int main()
      {
          Node s;
          s.a=1,s.b=2,s.c=3;
         printf("%d",s);
         return 0;
      }
  
 

输出:29 即(11101)

四,总结

如果抛弃字节的概念,把所有内存都看成按低比特到高比特的排列,那么规律就比较简洁统一:

(1)大端就是高位在低比特,小端就是高位在高比特,所有原子类型都符合这个排列规则

(2)结构体成员按照成员顺序从低比特到高比特排列,无论是大端还是小端,无论是普通原子类型还是结构体还是位域。而结构体成员内部的比特排列,按照规则递归定义。

文章来源: blog.csdn.net,作者:csuzhucong,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/nameofcsdn/article/details/114134721

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。