大小端原理以及如何判断

内存大端小端存储解析

参考链接:
https://blog.csdn.net/melody_1016/article/details/81910873?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase
计算机内存中有大小端之分,

首先数据有高位和低位,如123,则1为高位,3为低位。
在无论什么机器上,地址都是从低往高的,也就是如000-001-002-003等。
大端模式(Big-endian):高位数放在低位地址上,低位数放在高位地址上。这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放。
小端模式(Little-endian),是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址。这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。

如何判断一台机器是大端模式还是小端模式?

判断是这样的思路:想办法取出一个字节的内容,就可以知道是哪种存储方式。

两种方法1.用指针的办法:把变量的地址强制类型转换为char*,这样就可以每次取出一个字节的内容。

#include<stdio.h>
int 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)大小能被其包含的所有基本数据类型的大小所整除。

利用联合体判断大小端代码实现:

#include<stdio.h>
union 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;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值