大端和小端问题

转载 2012年03月24日 11:03:32

一、大小端

          在现代“冯.诺依曼体系结构”计算机中,它的数制都是采用二进制来存储,并且是以8位,一个字节为单位,产生内存地址系统。数据在内存中有如下三种存在方式:

           1、从静态存储区分配:此时的内存在程序编译的时候已经分配好,并且在程序的整个运行期间都存在。全局变量,static变量等在此存储。

           2、在栈区分配:在程序的相关代码执行时创建,执行结束时被自动释放。局部变量在此存储。栈内存分配运算内置于处理器的指令集中,效率

                                               高,但容量有限。

            3、在堆区分配:动态分配内存。用new/malloc时开辟,delete/free时释放。变量的生存期由用户指定,灵活,但会有内存泄露等问题。

           对于像C++中的char 这样的数据类型,它本身就是占用一个字节的大小,不会产生什么问题。但是当数制类型为int,在32bit的系统中,它需要占用4个字节(32bit),这个时候就会产生这4个字节在寄存器中的存放顺序的问题。比如int maxHeight = 0x12345678,&maxHeight = 0x0042ffc4。具体的该怎么存放呢?这个时候就需要理解计算机的大小端的原理了。

          大端:(Big-Endian)就是把数值的高位字节放在内存的低位地址上,把数值的地位字节放在内存的高位地址上。

          小端:(Little-Endian)就是把数字的高位字节放在高位的地址上,低位字节放在低位地址上。

          我们常用的x86结构都是小端模式,而大部分DSP,ARM也是小端模式,不过有些ARM是可以选择大小端模式。所以对于上面的maxHeight是应该以小端模式来存放,具体情况请看下面两表。

小端模式

    地址 0x0042ffc4 0x0042ffc5 0x0042ffc6 0x0042ffc7

数值

0x78

0x56

0x34

0x12

                                                                                                                                     
大端模式
地址 0x0042ffc4 0x0042ffc5 0x0042ffc6 0x0042ffc7
数值

0x12

0x34

0x56

0x78


         通过上面的表格,可以看出来大小端的不同,在这里无法讨论那种方式更好,个人觉得似乎大端模式更符合我的习惯。注:在这里我还要说一句,其实在计算机内存中并不存在所谓的数据类型,比如char,int等的。这个类型在代码中的作用就是让编译器知道每次应该从那个地址起始读取多少位的数据,赋值给相应的变量。)


简单判断大小端代码 1:取地址

#include “stdio.h”

int CheckCPU(void)
{
	int test = 1;
	if ((*(char *)&test ) == 1) 
	{
		printf(“little endian\n”);
	}
	else
		printf(“big endian”);
}



简单判断大小端代码 2:利用union从低地址存放特性

#include “stdio.h”

int CheckCPU(void)
{
	union {
		int    a;
		char  b;
	}test;

	test.a = 1;

	if ((test.b == 1)
		printf(“little endian\n”);
	else
		printf(“big endian\n”);
}


区分大端与小端有什么用呢? 如果两个不同Endian的机器进行通信时, 就有必要区分了~~~




参考链接:http://www.cnblogs.com/leezhm/archive/2011/07/19/2110864.html

字节序——大端(Big Endian)和小端(Little Endian)

每次碰到这个问题都需要现查资料,脑子不够用啊,索性就把它的来龙去脉写下来,加深一下印象。 1. 字节序问题的存在原因 自计算机采用byte作为存储单位起,字节序就是一个有争议的话题。这是因为我们通...
  • scaleqiao
  • scaleqiao
  • 2015年01月17日 17:27
  • 941

什么是小端格式和大端格式

http://blog.chinaunix.net/uid-21515847-id-1825106.html
  • wangjingyu00711
  • wangjingyu00711
  • 2014年11月19日 13:48
  • 468

如何判断主机是大端还是小端(字节序)

简单的判断大端还是小端 字节序
  • wangcg123
  • wangcg123
  • 2016年03月29日 13:34
  • 764

小端格式和大端格式(Little-Endian&Big-Endian)

小端格式和大端格式(Little-Endian&Big-Endian) 不同的CPU有不同的字节序类型,这些字节序是指整数在内存中保存的顺序。 最常见的有两种: 1. Lit...
  • wzw88486969
  • wzw88486969
  • 2014年03月11日 12:02
  • 754

【转】轻松记住大端小端的含义(附对大端和小端的解释)

转自:http://www.cnblogs.com/wuyuegb2312/archive/2013/06/08/3126510.html        或许你曾经仔细了解过什么是大端小端,也动手编...
  • firstlai
  • firstlai
  • 2015年11月18日 20:50
  • 1538

大端和小端区别-linux

Little-Endian:低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。 Big-Endian:高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。 记忆方法:小端:低地址存放...
  • ccy365263452
  • ccy365263452
  • 2013年11月28日 10:01
  • 2063

windows和linux是小端还是大端

在博客园看到这么一篇文章:http://www.cnblogs.com/chio/archive/2007/09/18/897126.html         之后百度了几个页面,大端——高尾端...
  • wind_sncz
  • wind_sncz
  • 2016年10月24日 18:18
  • 4875

题目:如何判断一个机器是大端还是小端

如何判断一个机器是大端还是小端      关于大端小端的概念,     小端:数据的高位字节存放在高地址内,数据的低位字节存放在低地址内。     大端:数据的高位字节存放在低地址内,数...
  • lanmolei814
  • lanmolei814
  • 2015年03月18日 22:45
  • 1437

Java大端字节和小端字节

1、什么是大端和小端 1) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。2) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的...
  • hfmbook
  • hfmbook
  • 2017年04月17日 11:29
  • 597

计算机大端模式和小端模式 内存对齐问题(sizeof)

一、大端模式和小端模式的起源         关于大端小端名词的由来,有一个有趣的故事,来自于Jonathan Swift的《格利佛游记》:Lilliput和Blefuscu这两个强国在过去的36个...
  • yangcs2009
  • yangcs2009
  • 2014年09月30日 19:08
  • 3139
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:大端和小端问题
举报原因:
原因补充:

(最多只允许输入30个字)