C 语言编程 — 大小端区分

举报
云物互联 发表于 2021/08/05 23:38:10 2021/08/05
【摘要】 目录 文章目录 目录大端、小端区分方式 1区分方式 2 大端、小端 大端:高位字节放在内存的低地址端,低位字节放在内存的高地址端,CPU 对操作数的存放方式从高字节到低字节。 小端:低位字节放在内存的低地址端,高位字节放在内存的高地址端,CPU 对操作数的存放方式从低字节到高字节。 假设我们的内存是这样的: 我们要存一个数据 0x4433221...

目录

大端、小端

大端:高位字节放在内存的低地址端,低位字节放在内存的高地址端,CPU 对操作数的存放方式从高字节到低字节。

小端:低位字节放在内存的低地址端,高位字节放在内存的高地址端,CPU 对操作数的存放方式从低字节到高字节。

假设我们的内存是这样的:
在这里插入图片描述

我们要存一个数据 0x44332211 到这块内存里面去如果系统是 小端模式 的话,存储方式如下图:
在这里插入图片描述

如果系统是 大端模式 的话,存储方式如下图:
在这里插入图片描述

区分方式 1

通过判断内存的低地址是否为 1 来区分大小端:指针类型转换,将长度大的 int 类型转换为长度小的 char 类型,最后再取 char* 指针的值,就知道数据 1 存放在高端地址还是低端地址了。

#include <stdio.h>


int main()
{ int i = 1; (*(char*)&i == 1) ? printf("Little-endian\n") : printf("Big-endian\n"); return 0;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

区分方式 2

利用共用体的特点:使用长度最大的那个数据类型作为共用体的大小。所以,char a 使用的是 int b 的空间大小,判断 a 的值,也就是判断低地址的数据值。

#include <stdio.h>


union System { char a; int b;
};

int main()
{ union System s; s.b = 1; printf("0x%x\n", &s.a); printf("0x%x\n", &s.b); if (s.a == 1) { printf("Little-endian\n"); } else { printf("Big-endian\n"); } return 0;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

文章来源: is-cloud.blog.csdn.net,作者:范桂飓,版权归原作者所有,如需转载,请联系作者。

原文链接:is-cloud.blog.csdn.net/article/details/106898871

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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