大小端原理以及如何判断
发布日期:2021-11-20 10:18:11
浏览次数:16
分类:技术文章
本文共 1283 字,大约阅读时间需要 4 分钟。
参考链接:
计算机内存中有大小端之分,首先数据有高位和低位,如123,则1为高位,3为低位。
在无论什么机器上,地址都是从低往高的,也就是如000-001-002-003等。 大端模式(Big-endian):高位数放在低位地址上,低位数放在高位地址上。这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放。 小端模式(Little-endian),是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址。这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。如何判断一台机器是大端模式还是小端模式?
判断是这样的思路:想办法取出一个字节的内容,就可以知道是哪种存储方式。
两种方法:1.用指针的办法:把变量的地址强制类型转换为char*,这样就可以每次取出一个字节的内容。
#includeint main(){ int a = 1;//这里为了方便,以1为例 char*p = (char*)(&a); if (*p == 1) { printf("little endian\n");//小端存储 } else { printf("big endian\n");//大端存储 } return 0;}
2.用联合的知识:在联合体中定义一个char 类型的变量和int类型的变量,利用二者所占同一段存储空间,可以通过引用联合体变量中的成员访问char 类型的数据。取出一个字节的内容。
【联合体知识点】:当多个数据需要共享内存或者多个数据每次只取其一时,可以利用联合体(union)。1)联合体是一个结构; 2)它的所有成员相对于基地址的偏移量都为0; 3)此结构空间要大到足够容纳最"宽"的成员; 4)其对齐方式要适合其中所有的成员
如联合体:
union U{ char s[9]; int n; double d;};
其中s占9字节,n占4字节,d占8字节,因此其至少需9字节的空间。然而其实际大小并不是9,用运算符sizeof测试其大小为16.这是因为这里存在字节对齐的问题,9既不能被4整除,也不能被8整除。因此补充字节到16,这样就符合所有成员的自身对齐了。从这里可以看出联合体所占的空间不仅取决于最宽成员,还跟所有成员有关系,即其大小必须满足两个条件:1)大小足够容纳最宽的成员;2)大小能被其包含的所有基本数据类型的大小所整除。
利用联合体判断大小端代码实现:
#includeunion endian{ char c; int i;}en; int main(){ en.i = 1; if (en.c == 1) { printf("little endian\n"); } else { printf("big endian\n"); } return 0;}
转载地址:https://blog.csdn.net/weixin_43223362/article/details/107318633 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月22日 06时16分46秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
java框架篇spring cloud之服务发现consul
2019-04-27
Java架构篇rest api 幂等性
2019-04-27
java算法篇给定一个数组找出第一个重复(不重复)的元素
2019-04-27
Java框架篇spring sleuth分布式日志查询
2019-04-27
java算法篇KMP算法及应用
2019-04-27
LeetCode刷题Easy篇在整型数组寻找两个数的和等于指定数
2019-04-27
LeetCode刷题Medium篇int型数组,求满足和等于k的连续子数组个数
2019-04-27
LeetCode刷题Medium篇寻找字符串中最长的不重复子串(滑动窗口解法)
2019-04-27
LeetCode刷题Medium篇int型数组,求k个连续数的最大和(滑动窗口解法)
2019-04-27
LeetCode刷题Medium篇两个倒序链表数字相加
2019-04-27
java架构篇NodeJS,Vue,前后端分离都是什么鬼
2019-04-27
LeetCode刷题Easy篇寻找元素插入位置
2019-04-27
linux下Telnet配置
2019-04-27
Linux与Linux、window之间的文件共享
2019-04-27
linux下alias命令详解
2019-04-27
Linux中profile、bashrc、bash_profile之间的区别和联系 .
2019-04-27
Linux七天系列------之一
2019-04-27
linux七天系列之二
2019-04-27
架构师进阶之一消息中间件RabbitMQ和Kafka比较
2019-04-27
利用SecureCRT在linux与Windows之间互传文件
2019-04-27