大端模式与小端模式
有时候,用C语言写程序时需要知道是大端模式还是小端模式。
为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如果将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。
高数据位与低数据位
inta=46178;
00000000 0000 0000 1011 0100 0110 0010 二进制
左侧是数据高位,向右依次降低。
重点在理解这个高低位
4字节内存地址
这是一个整型4字节内存,a要存在这段内存中,内存地址顺序递增,由低地址位 递增 到高地址位。
大端存储:字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中;
误区:数据不是原模原样存进去,是按二进制形式存储的。
比如:int a=46178;不是1占一个字节,2占一个字节,3占一个字节,4占一个字节。
小端存储:(小高高,小低低),字数据的高字节存储在高地址中,而字数据的低字节则存放在低地址中;
测试我们系统大小端的存储方法:思路就是看第一个字节的值是多少。一般使用联合体测试。
联合体特点:所有成员起始地址一致,所有成员引用的是内存中的相同位置。
测试用例
#include<stdio.h>
#include<windows.h>
/
//大端模式与小端模式测试
///
int main()
{
//(方法1)联合体
union
{
inta;
chararray[4];
}b = {46178 };
printf("%d,%d,%d,%d", b.array[0], b.array[1], b.array[2],b.array[3]);
//(方法2)法类型转换
inta = 46178;
char*p = (char*)&a;
printf("%d,%d,%d,%d",*p,*(p+1),*(p+2),*(p+3));
//方法1与方法2运行结果: 98,-76,0,0
//数据的低数据位放在内存的低地址,故本机器为小端模式存储
//X86一般为小端存储
system("pause");
return0;
}
测试函数
int CheckSystem()
{
union check
{
inti;
charch;
}c;
c.i = 1;
return(c.ch == 1);
}