大小端存储
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大小端存储相关的知识,希望对你有一定的参考价值。
参考技术A 在计算机系统中,存储是以字节为单位的,每个地址单元都对应着一个字节,一个字节=8bit。在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器)。对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,如何安排多个字节的存储,这就有了大端存储模式和小端存储模式。小端:较高的有效字节存放在较高的的存储器地址,较低的有效字节存放在较低的存储器地址。
大端:较高的有效字节存放在较低的存储器地址,较低的有效字节存放在较高的存储器地址。
如果将一个16位的整数0x1234存放到一个短整型变量(short)中。这个短整型变量在内存中的存储在大小端模式由下表所示。
C语言判断大小端模式
方法一:
voidIsBigEndian()
shortinta=0x1122; //十六进制,一个数值占4位charb = *(char*)&a;//通过将short(2字节)强制类型转换成char单字节,b指向a的起始字节(低字节)
if( b ==0x11) //低字节存的是数据的高字节数据
//是大端模式
else
//是小端模式
方法二:
voidIsBigEndian() //原理:联合体union的存放顺序是所有成员都从低地址开始存放,而且所有成员共享存储空间
uniontemp
shortint a;
char b;
temp;
temp.a=0x1234;
if(temp.b==0x12) //低字节存的是数据的高字节数据
//是大端模式
else
//是小端模式
参考:https://www.jianshu.com/p/152268b0ea19
嵌入式快充:内存大小端
嵌入式快充:内存大小端
一、大小端概念
目前大多数计算机中,存储的基本单元是一个字节,对应着8位长度,当存储8位以上的单元,比如:字(16位)、双字(32位)时,他们是拆分成8位进行存储的,因为存储空间是一个连续的地址,如果我们要存储一个16进制的数,他可以分为高8位字节和低8位字节数据,如果高8位字节的数据放在高地址,低位8位数据放在低地址,为小端存储,相反如果高8位数据放在低地址,低8位数据放在高地址,则为大端存储,具体可以由下图表示:
二、使用C判断当前机器大小端
使用C语言判断大小端,我们可以先定义一个16位的已知数据,使用一个char指针强制指向已知数据的地址(指向的是低地址),然后我们以16进制打印指针指向地址的数据
#include <stdio.h>
int main(void)
{
unsigned short u16;
unsigned char* u8;
u16 = 0x1234;
u8 = (unsigned char*)&u16;
printf("%x",*u8);
return 0;
}
运行后结果如下
可以看到打印的是0x34,对应的是0x1234的低地址数据,所以当前计算机的存储方式为小端存储
以上是关于大小端存储的主要内容,如果未能解决你的问题,请参考以下文章