内存大小端

举报
用户已注销 发表于 2021/11/19 04:09:40 2021/11/19
【摘要】 目录 一,大端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

代码:


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

输出:1 1 0 0

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

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

2,结构体

代码:


  
  1. #include <stdio.h>
  2. typedef struct Node
  3. {
  4. int a;
  5. int b;
  6. }Node;
  7. int main()
  8. {
  9. Node s;
  10. s.a=1,s.b=257;
  11. char *p=(char *)&s;
  12. for(int i=0;i<8;i++)printf("%d ",*(p+i));
  13. return 0;
  14. }

输出:1 0 0 0 1 1 0 0

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

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

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

 

三,比特大小端

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

在网上找到一个示例:


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

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

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


  
  1. #include <stdio.h>
  2. typedef struct Node
  3. {
  4. int a:1;
  5. int b:2;
  6. int c:29;
  7. }Node;
  8. int main()
  9. {
  10. Node s;
  11. s.a=1,s.b=2,s.c=3;
  12. printf("%d",s);
  13. return 0;
  14. }

输出:29 即(11101)

 

四,总结

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

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

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

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

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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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