大端格式与小端格式(Little-Endian&&Big-Endian)详解


这篇文章主要讲两点,第一点是介绍大端格式与小端格式的区别,第二点是用代码测试我们的CPU采用的是大端格式还是小端格式,我会给出代码然后分析。

      PS:下面这些可以忽略

记得又刚出来找工作的时候笔试有这一题,其实我知道大端格式与小端格式的区别,但是题目是这样问我的,“请叙述Little-Endian&&Big-Endian的差异”,当时是一脸懵逼啊,因为这英文我们见过只知道一个Big和Little,我当时还在想这个公司出一些英文的好骚气啊,但是现在想想,这也算是基础的了吧,随着知识的加深,算是多见不怪吧,让我们开始讲解吧…….


1、大端格式与小端格

  1. 大端格式:数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;
  2. 小端格式:数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中;

接下来我们用图表来模拟一下,比如我这里有一份数据 0x12345678 ,这份数据占四个字节,因为一位十六进制能用四位二进制来表示,这份十六进制有八位,也就是四个字节,也就是说高位的“12”占一位字节、、、、、、低位的“12”占一位字节,这是我当初学这方面的知识困惑的地方,我就想为什么“12”存储在一块,而不是“1”和“2”存储在两个地址中,人都是从小白走过来的,对吧。。。继续说,而计算机是以字节为单位处理的,我们再次假设四个地址吧,别为:0x8000、0x8001、0x8002、0x8003;这四个地址代表他们指向的空间为一个字节,接下来将这份十六进制数存储为大端格式和小端格式,看图,没图,那就来看表吧:

右边地址、下边格式 0x8000 0x8001 0x8002 0x8003
大端格式 78 56 34 12
小端格式 12 34 56 78

这就是大端格式以及小端格式的表示,比如在大端格式中,高位的数据存放在低地址中,高位字节是“78”,存放在低地址“0x8000”中,然后次高字节“56”存放在次低地址“0x8001”中,以此类推,小端格式则预习相反,立即推–>懂了.


2、测试CPU时大端还是小端格式的代码

先贴出代码,再分析!!!

#include <stdio.h>
void main(void)
{
	union MyUnion
	{
		int temp;  //占四个字节
		char temp2;//占一个字节
	}test;

	test.temp = 1;

		if(test.temp2 == 1)
		{
			printf("小端格式\n");
		}
		else
		{
			printf("大端格式\n");
		}
		return;
}

由于不能复制,代码存百度云了,点击此处下载代码例程,在这里定义了一个共用体,一句话概括就是他们占用共同的空间,再该程序意思就是,temp和temp2占用共同的空间,他们的变量指向同一个起始地址,只是,temp占用四个字节,而temp2占用一个字节,正是利用了这个特性,我们就能巧妙的测试出CPU采用的是什么格式,来看图说话,嘿嘿,还是没图,再继续看表吧,我们还假设存储地址从0x8000开始,1用int类型的十六进制表示就是0x00000001,用char类型的十六进制表示就是0x01,下表是上述共用体中的两个变量使用大端格式的存储形式

右边地址、下边变量 0x8000 0x8001 0x8002 0x8003
temp变量 00 00 00 01
temp2变量 00 × × ×

下图是使用小端格式的存储方式

右边地址、下边变量 0x8000 0x8001 0x8002 0x8003
temp变量 01 00 00 00
temp2变量 01 × × ×

上面的表看懂了就行了,第一个表再给temp赋值的时候采用的是大端格式,也就是把最低位的字节“01”给高地址“0x8003”,而把高位的字节“00”赋值给低地址“0x8000”,因为temp2指向的地址也为“0x8000”,这是共用体的特性,所以再给temp赋值的时候也就相当于给temp2赋值为0了。再小端格式采用同样的思路也就相当于给temp2赋值为1了,可以根据这两个情况下temp2值得情况下写一个判断语句就可以了,到此为止,你也就明白了大端格式和小端格式的区别了,不太懂可以从网上找两个题目锻炼一下。这篇文章就到此结束吧!!!


如有哪里出错,可联系我纠正,谢谢,首页有微信号!


Tags:
1,845 Comments