【总结】大端、小端存储模式的那点事

-----------------------------------------------------------------------------------------------------

大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;

小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。

简而言之:大端模式就是低位高地址,高位低地址;

小端模式就是低位低地址,高位高地址;

例如:int num = 1; num占一个整形空间的大小,四个字节。如果你的机器是小端存储,那么num在内存中应该是这样存储的:01 00 00 00 ;如果你的机器是大端存储,那么num在内存中应该是这样存储的:00 00 00 01 。

-----------------------------------------------------------------------------------------------------

在C语言中,一般有两种常见的方法来检测机器的存储模式;

-----------------------------------------------------------------------------------------------------

C语言代码:

//方法一:利用指针;
int sys_check()
{
	/*
	**如果你的电脑是小端存储,则内存中为01 00 00 00;大端则为:00 00 00 01;
	*/
	int num = 1;				

	/*
	**取内存中的第一个字节,小端返回1,大端返回0;
	*/
	if (1 == *(char *)&num)
	{
		return 1;   
	}
	else
	{
		return 0;
	}
}

//方法二:利用联合体;
int sys_check()
{
	/*
	**该共用体占四个字节,c访问第一个字节,num访问所有字节,
	**若为小端,则第一个字节为1,否则为0;
	*/
	union CHECK
	{
		int num;
		char c;
	}_check;

	_check.num = 1;
        
        /*
        **小端返回1,大端返回0;
	*/
	if (1 == _check.c)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

-----------------------------------------------------------------------------------------------------

干货小知识:为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为 8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于 8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。例如一个16bit的short型x,在内存中的地址为0x0010,x的值为0x1122,那么0x11为高字节,0x22为低字节。对于 大端模式,就将0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。小端模式,刚好相反。我们常用的X86结构是小端模式,而KEIL C51则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。

名字由来:在乔纳森·斯威夫特的著名讽刺小说《格列夫游记》中,小人国内部分裂成Big-endian和Little-endian两派,区别在于一派要求从鸡蛋的大头把鸡蛋打破,另一派要求从鸡蛋的小头把鸡蛋打破。斯威夫特借以讽刺英国的政党之争,在计算机工业中指数据储存顺序的分歧。

——摘自《百度百科》。

--------------------------------------------------------------------------------------------------------------------------------------------------------

时间: 2024-11-11 01:08:47

【总结】大端、小端存储模式的那点事的相关文章

20160403_联合体的本质和使用 & 与struct的不同 & 大端存储和小端存储

/************* 联合体的本质和使用 及 与struct的不同 及 大端存储和小端存储 ************ “联合体”(union)与“结构体”(struct)有一些相似之处.但两者有本质上的不同. [相似] union,中文名“联合体.共用体”,在某种程度上类似结构体struct的一种数据结构,共用体(union)和结构体(struct)同样可以包含很多种数据类型和变量. [不同] 在结构体中,各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和.而在“联合”中,各

大端小端格式详解

1. 什么是大端,什么是小端: 所谓的大端模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中: 所谓的小端模式,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中. 2.为什么会有大小端: 为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit.但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于8位的处

栈增长方向与大端/小端问题

转:http://www.cnblogs.com/xkfz007/archive/2012/06/22/2558935.html 栈增长和大端/小端问题是和CPU相关的两个问题.在内存管理中,与栈对应是堆.对于堆来讲,生长方向是向上的,也就是向着内存地址增加的方向:对于栈来讲,它的生长方式是向下的,是向着内存地址减小的方向增长.在内存中,“堆”和“栈”共用全部的自由空间,只不过各自的起始地址和增长方向不同,它们之间并没有一个固定的界限,如果在运行时,“堆”和 “栈”增长到发生了相互覆盖时,称为“

【转】大小端存储模式精解

计算机系统中内存是以字节为单位进行编址的,每个地址单元都唯一的对应着1个字节(8 bit).这可以应对char类型数据的存储要求,因为char类型长度刚好是1个字节,但是有些类型的长度是超过1个字节的(字符串虽然是多字节的,但它本质是由一个个char类型组成的类似数组的结构而已),比如C/C++中,short类型一般是2个字节,int类型一般4个字节等.因此这里就存在着一个如何安排多个字节数据中各字节存放顺序的问题.正是因为不同的安排顺序导致了大端存储模式和小端存储模式的存在. 1. 概述 1.

判断CPU 是小端存储(Little endian)还是大端存储(Big endian)模式

第一个版本: //return true in big-endian machines bool check_big_endian1() { int a = 0; int *p = &a; *(char *)p = 1; return a != 1; } 采用union的第二个版本: //return true in big-endian machines bool check_big_endian2() { union{ int a; char b; }var;//sizeof(var)=4

大端/小端的存储模式

2017年11月23日大端/小端的存储模式1.大端: 如果是将高字节的数据存储在低地址,低字节数据存储在高地址,这种存储模式就是大端模式:2.小端: 如果是将高字节的数据存储在高地址,低字节数据存储在低地址,这种存储模式就是小端模式:3.对大小端模式的测试方法: 1).使用union共用体进行测试: #include <stdio.h> #include <stdlib.h> //默认为小端模式: //使用共用体测试: union test { int a; char b; };

测试计算机是小端存储还是大端存储

    一.理解大端存储和小端存储的概念     1).大端存储:大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放.                 2).小端存储:小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致.        

小端存储(little Endian)大端存储(big Endian)

小端存储--低内存低字节 87654321 字节或半字节的最低位字节(Lowest Significant Bit,LSB)存放于内存最低位字节地址上.即最低地址存放的最低字节,为Power PC,Intel x86 系列等采用. int a=0x12345678; 78为低字节 12为高字节 void fFun() { int a=0x12345678; char *p=(char *)&a; printf("0x%02X\n",*(++p)); } 0x56 大端存储(bi

大端和小端存储

小端存储法——高地址存高字节,低地址存低字节(高存高,低存低)(intel/ARM) 0x表示十六进制 数值:0x12 34 56 78在小端存储器里如何存储 0x8003 0x12 0x8002 0x34 0x8001 0x56 0x8000  0x78 1 BYTE = 8bit 大端存储法——高地址存低字节,低地址存高字节(高存低,低存高)(IBM大型机/网络字节序) 数值:0x12 34 56 78在小端存储器里如何存储 0x8003 0x78 0x8002 0x56 0x8001 0x