大小端字节

1、概念

所谓大端小端,指的是对于多字节的数据类型(比如,int)在内存中存放的字节顺序。小端是指低地址的字节存放的是数据的低位,高地址字节存放的是数据的高位。大端是指低地址字节存放的是数据的高位,高地址字节存放数据的高位。简单地说,低位字节存放数据的高位就是大端,低位就是小端。

下面是一个例子,用来说明整数0x12345678在大端小端模式下不同的存放顺序。

内存地址 小端模式 大端模式
0x5250 0x78 0x12
0x5251 0x56 0x34
0x5252 0x34 0x56
0x5253 0x12 0x78

你可能会想,我是不是搞错了。但的确没错,因为12是数据的高位,78是数据的低位。

2、如何判断

判断的基本原理都是取出一个多字节数据结构的第一个字节,如果该字节是数据的高位,那么该机器就是大端;如果该字节是数据的低位,那么该机器就是小端。废话不说,上代码。

2.1 指针转换

#nclude <stdio.h>
int isBigEndian();
int main()
{
	printf("Size of int type:%d bytes.\n",sizeof(int));
	int endianFlag=isBigEndian();
	printf("endianFlag:%d\n",endianFlag);
	if (endianFlag)
	{
		printf("This is a Big Endian machine.\n");
	}else
	{
		printf("This is NOT a Big Endian machine.\n");
	}
	return 0;
}
int isBigEndian()  
{
	int a = 0x12345678;
	//通过将int强制类型转换成char单字节
	char b =  *(char *)&a;
	//通过判断起始存储位置,即第一个字节的内容,来判断是不是大端存储
	if( b == 0x78)  
	{
		return 0;
	}
	return 1;
}

2.2 联合

#include <stdio.h>
int isBigEndian();
int main()
{
	printf("Size of int type:%d bytes.\n",sizeof(int));
	int endianFlag=isBigEndian();
	printf("endianFlag:%d\n",endianFlag);
	if (endianFlag)
	{
		printf("This is a Big Endian machine.\n");
	}else
	{
		printf("This is NOT a Big Endian machine.\n");
	}
	return 0;
}
int isBigEndian()  
{
	union IntCharUnion
	{  
		int a;
		char b;
	}temp; 
	temp.a = 0x12345678;  
	if(temp.b == 0x78)
	{
		return 0;
	}
	return 1;
}
时间: 2024-12-11 12:12:04

大小端字节的相关文章

最简单的方式教你理解大小端字节序

学过编程的人都应该知道大小端字节序的概念,但是很多时候,总是把他们弄混,这是整理出来的一份很简单的方式理解字节序的文章,废话不多说,这里直接入正题. 什么是字节序? 字节序,简单来说,就是指的超过一个字节的数据类型在内存中存储的顺序 那么就很明显了,像char这样的类型,肯定不存在字节序的问题了. 字节序分为哪几类? 大端字节序: 高位字节数据存放在低地址处,低位数据存放在高地址处: 小段字节序: 高位字节数据存放在高地址处,低位数据存放在低地址处: 网络字节序: TCP/IP协议传输数据时,字

[C&amp;C++]大小端字节序转换程序

大端模式:  数据的高字节存在低地址  数据的低字节存在高地址 小端模式:  数据的高字节存在高地址  数据的低字节存在低地址 如图,i为int类型占4个字节,但只有1个字节的值为1,另外3个字节值为0:取出低地址上的值,当其为1时则为小端模式,为0时为大端模式. //大小端模式的判断 //方法一:利用联合体所有成员的起始位置一致, //对联合体中的int类型赋值,然后判断联合体中char类型的值的大小 #include <iostream> #include <iomanip>

大小端字节序的来历(摘自《深入理解计算机系统 第三版》)

术语“little endian(小端)”和“big endian(大端)”出自Jonathan Swift的<格列佛游记>(Gulliver's Trabels)一书,其中交战的两个派别无法就应该从哪一端(小端还是大端)打开一个半熟的鸡蛋打成一致.就像鸡蛋的问题一样,选择何种字节顺序没有技术上的理由,因此争论沦为关于社会政治论题的争论. 一下是Jonathan Swift在1726年关于大小端之争历史的描述: “......下面要告诉你的是,Lilliput和Blefuscu这两大强国在过去

大小端字节顺序

字节序的问题涉及硬件架构,目前主要是Motorola的PowerPC系列CPU和Intel的x86系列CPU.PowerPC系列采用big endian方式存储数据,而x86系列则采用little endian方式存储数据.那么究竟什么是big endian,什么又是little endian呢? 为方便理解,摘了INTER手册中的一张图.呵呵. 字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端.大端两种字节顺序.小端字节序指低字节数据存放在内存低地址处,高字节数据存放在内

C语言 大小端 字节对齐

参考:http://www.cnblogs.com/graphics/archive/2011/04/22/2010662.html 1. 大端序:数据的高位字节存放在地址的低端,低位字节存放在地址的高端 2. 小端序:数据的高位字节存放在地址的高端,低位字节存放在地址的低端 记忆方式: 大端序是按照数字的书写顺序进行存储的,小端序是颠倒书写顺序进行存储的. 结构体对齐问题:http://www.cnblogs.com/clover-toeic/p/3853132.html

大小端字节序

body { font-family: 微软雅黑,"Microsoft YaHei", Georgia,Helvetica,Arial,sans-serif,宋体, PMingLiU,serif; font-size: 10.5pt; line-height: 1.5; } html, body { } h1 { font-size:1.5em; font-weight:bold; } h2 { font-size:1.4em; font-weight:bold; } h3 { fon

大小端的独特判定方法

看见这个判定方法很特别,收集了~ int i=1; char *p=(char *)&i; if(*p==1) printf("1"); else printf("2"); 大小端存储问题,如果小端方式中(i占至少两个字节的长度)则i所分配的内存最小地址那个字节中就存着1,其他字节是0.大端的话则1在i的最高地址字节处存放,char是一个字节,所以强制将char型量p指向i则p指向的一定是i的最低地址,那么就可以判断p中的值是不是1来确定是不是小端. 请写一

linux kernel如何处理大端小端字节序

最近在做将kernel由小端处理器(arm)向大端处理器(ppc)的移植的工作,现在kernel进入console稳定工作,基本工作已经完成,不过移植中有很多心得还是需要总结下,今天先将kernel对于大小端字节序的处理来总结下. 之前写过大小端字节序的思考,文章链接地址:http://blog.csdn.net/skyflying2012/article/details/42065427. 根据之前的理解,字节序可以认为是处理器主观的概念,就像人如何去看待事物一样,处理器分大端和小端,对于内存

(转)大小端模式详解

int i=1; char *p=(char *)&i; if(*p==1) printf("1"); else printf("2"); 大小端存储问题,如果小端方式中(i占至少两个字节的长度)则i所分配的内存最小地址那个字节中就存着1,其他字节是0.大端的话则1在i的最高地址字节处存放,char是一个字节,所以强制将char型量p指向i则p指向的一定是i的最低地址,那么就可以判断p中的值是不是1来确定是不是小端. 请写一个C函数,若处理器是Big_end