转!大端模式&小端模式
大端模式&小端模式
在C语言中除了8位的char型之外,还有16位的short型,32位的long型(要看具体的编译器),对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。 大端模式: 字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。 小端模式: 与大端存储模式相反,在小端存储模式中,低地址中存放的是字数据的低字节,高地址存放的是字数据的高字节。 例如,16位宽的数0x1234在小端模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:
而在大端模式CPU内存中的存放方式则为:
32位宽的数0x12345678在小端模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:
而在大端模式CPU内存中的存放方式则为:
我们常用的X86结构是小端模式,而KEIL Note:采用大端方式进行数据存放符合人类的正常思维,而采用小端方式进行数据存放利于计算机处理。
(我的理解:小端模式在低字节就放一个低位)
下面这段代码可以用来测试一下你的编译器是大端模式还是小端模式:
int main()
{ short int x; char x0,x1; x=0x1122; x0=*((char*)&x); //低地址单元 printf("x0=%x\nx1=%x\n",x0,x1); |
本文引用通告地址:http://xfjane.spaces.eepw.com.cn/articles/trackback/item/70351
大端(Big
Endian)与小端(Little Endian)详解
【大端(Big
Endian)与小端(Little Endian)简介】
Byte Endian是指字节在内存中的组织,所以也称它为Byte Ordering,或Byte
Order。
对于数据中跨越多个字节的对象, 我们必须为它建立这样的约定:
(1) 它的地址是多少?
(2)
它的字节在内存中是如何组织的?
针对第一个问题,有这样的解释:
对于跨越多个字节的对象,一般它所占的字节都是连续的,它的地址等于它所占字节最低地址。(链表可能是个例外, 但链表的地址可看作链表头的地址)。
比如: int x, 它的地址为0×100。 那么它占据了内存中的Ox100, 0×101, 0×102,
0×103这四个字节(32位系统,所以int占用4个字节)。
上面只是内存字节组织的一种情况: 多字节对象在内存中的组织有一般有两种约定。
考虑一个W位的整数。
它的各位表达如下:[Xw-1, Xw-2, ... , X1, X0],它的
MSB (Most
Significant Byte, 最高有效字节)为 [Xw-1, Xw-2, ... Xw-8];
LSB (Least Significant
Byte, 最低有效字节)为 [X7,X6,..., X0]。
其余的字节位于MSB, LSB之间。
LSB和MSB谁位于内存的最低地址,
即谁代表该对象的地址?
这就引出了大端(Big Endian)与小端(Little Endian)的问题。
如果LSB在MSB前面,
既LSB是低地址, 则该机器是小端; 反之则是大端。
DEC (Digital Equipment
Corporation,现在是Compaq公司的一部分)和Intel的机器(X86平台)一般采用小端。
IBM, Motorola(Power PC),
Sun的机器一般采用大端。
当然,这不代表所有情况。有的CPU即能工作于小端, 又能工作于大端, 比如ARM, Alpha,摩托罗拉的PowerPC。
具体情形参考处理器手册。
具体这类CPU是大端还是小端,应该和具体设置有关。
(如,Power
PC支持little-endian字节序,但在默认配置时是big-endian字节序)
一般来说,大部分用户的操作系统(如windows,
FreeBsd,Linux)是Little Endian的。少部分,如MAC OS ,是Big Endian 的。
所以说,Little
Endian还是Big Endian与操作系统和芯片类型都有关系。
Linux系统中,你可以在/usr/include/中(包括子目录)查找字符串BYTE_ORDER(或
_BYTE_ORDER,
__BYTE_ORDER),确定其值。BYTE_ORDER中文称为字节序。这个值一般在endian.h或machine/endian.h文件中可以找到,有时在feature.h中,不同的操作系统可能有所不同。
对于一个数0×1122
使用Little
Endian方式时,低字节存储0×22,高字节存储0×11
而使用Big Endian方式时, 低字节存储0×11, 高字节存储0×22
经一网友指正,才知道,上面的描述,是不准确的.
想了下,觉得如下描述可能更合适:
使用Little
Endian方式存储数据时,数据的LSB相对最没意义的数据位,存放在低地址位置,这里的LSB也就是22了.也即,
低地址存储0×22,
高地址存储0×11
而使用Big
Endian方式存储数据时,数据的MSB最有意义的数据位,存放在低地址位置,这里的MSB也就是11了.也即
低地址存储0×11,
高地址存储0×22
助记:
1)所谓MSB
(Most Significant
Byte),名字很复杂,不知是否有人没搞懂,反正我开始看到这个词时候,就很糊涂,有点不完全理解.其实简单说MSB就是,一个数字中,最重要的那位,
举例来说,12004,中文读作,一万两千零四,那最高位的1,就表示了一万,此处就称作MSB,最有意义的位.
2)一般常见的数据存储,用文字写出来的时候,其内容书写格式,多数是从低地址到高地址.(更符合人类思维的原因)
举例,一个16进制数是
0×11 22 33, 而存放的位置是
地址0×3000
中存放11
地址0×3001
中存放22
地址0×3002
中存放33
连起来就写成地址0×3000-0×3002中存放了数据0×112233.
而这种存放和表示方式,正好符合大端.
解释的有点乱,希望有人能看懂.
如果还有哪里有误,还请各位继续指正.谢谢.
【用函数判断系统是Big
Endian还是Little Endian】
bool
IsBig_Endian()
//如果字节序为big-endian,返回true;
//反之为
little-endian,返回false
{
unsigned short test = 0×1122;
if(*(
(unsigned char*) &test ) == 0×11)
return TRUE;
else
return FALSE;
}//IsBig_Endian()
转自http://www.cnblogs.com/okaimee/archive/2010/07/19/1780609.html
====================================================================
====================================================================
http://wxxweb.blog.163.com/blog/static/135126900201022133740759/
大端模式与小端模式一、概念及详解
在各种体系的计算机中通常采用的字节存储机制主要有两种:
big-endian和little-endian,即大端模式和小端模式。
先回顾两个关键词,MSB和LSB:
MSB:Most
Significant Bit ——- 最高有效位
LSB:Least
Significant Bit ——- 最低有效位
大端模式(big-edian) big-endian:MSB存放在最低端的地址上。
举例,双字节数0×1234以big-endian的方式存在起始地址0×00002000中:
|
data |<– address
|
0×12 |<– 0×00002000
|
0×34 |<– 0×00002001
在Big-Endian中,对于bit序列中的序号编排方式如下(以双字节数0×8B8A为例):
bit
| 0 1 2 3 4 5 6 7 | 8 9 10 11 12 13 14 15
——MSB———————————-LSB
val
| 1 0 0 0 1 0 1 1 | 1 0 0 0 1 0 1 0 |
+——————————————–+
=
0×8 B 8 A
小端模式(little-endian)
little-endian:LSB存放在最低端的地址上。
举例,双字节数0×1234以little-endian的方式存在起始地址0×00002000中:
|
data |<– address
|
0×34 |<– 0×00002000
|
0×12 |<– 0×00002001
在Little-Endian中,对于bit序列中的序号编排和Big-Endian刚好相反,其方式如下(以双字节数0×8B8A为例):
bit
| 15 14 13 12 11 10 9 8 | 7 6 5 4 3 2 1 0
——MSB———————————–LSB
val
| 1 0 0 0 1 0 1 1 | 1 0 0 0 1 0 1 0 |
+———————————————+
=
0×8 B 8 A
二、数组在大端小端情况下的存储:
以unsigned
int value = 0×12345678为例,分别看看在两种字节序下其存储情况,我们可以用unsigned char
buf[4]来表示value: Big-Endian: 低地址存放高位,如下:
高地址
—————
buf[3]
(0×78) — 低位
buf[2]
(0×56)
buf[1]
(0×34)
buf[0]
(0×12) — 高位
—————
低地址
Little-Endian:
低地址存放低位,如下:
高地址
—————
buf[3]
(0×12) — 高位
buf[2]
(0×34)
buf[1]
(0×56)
buf[0]
(0×78) — 低位
————–
低地址
转!大端模式&小端模式的更多相关文章
- 判断CPU是大端还是小端模式
在小端模式中,低位字节放在低地址,高位字节放在高地址:在大端模式中,低位字节放在高地址,高位字节放在低地址.big-endian和little-endian,51单片机是典型的大端模式,Intel电脑 ...
- 【转】如何判断CPU是大端还是小端模式
原文网址:http://blog.csdn.net/ysdaniel/article/details/6617458 如何判断CPU是大端还是小端模式 http://blog.sina.com.cn/ ...
- 大端模式&小端模式、主机序&网络序、入栈地址高低问题
一.大端模式&小端模式 所谓的“大端模式”,是指数据的低位(就是权值较小的后面那几位)保存在内存的高地址中,而数据的高位,保存在内存的低地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处 ...
- 大端模式、小端模式和C#反转
A.C#大端模式和小端模式. 小端(little-endian)模式:低地址上存放低字节,高地址上存放高字节. 如0x11223344→ byte[] numBytes = new byte[]{ 0 ...
- 大端模式 VS 小端模式
简单点说,就是字节的存储顺序,如果数据都是单字节的,那怎么存储无所谓了,但是对于多字节数据,比如int,double等,就要考虑存储的顺序了.注意字节序是硬件层面的东西,对于软件来说通常是透明的.再说 ...
- Linux网络编程1——小端模式与大端模式
数据存储优先顺序的转换 计算机数据存储有两种字节优先顺序:高位字节优先(称为大端模式)和低位字节优先(称为小端模式).内存的低地址存储数据的低字节,高地址存储数据的高字节的方式叫小端模式.内存的高地址 ...
- C/C++ 工具函数 —— 大端模式和小端模式的互换
小端模式:小在小,大在大:大端模式:小在大,大在小: uint32_t swap_endian(uint32_t val) { val = ((val << 8) & 0xFF00 ...
- 【C/C++开发】内存对齐(内存中的数据对齐)、大端模式及小端模式
数据对齐,是指数据所在的内存地址必须是该数据长度的整数倍.DWORD数据的内存起始地址能被4除尽,WORD数据的内存起始地址能被2除尽.X86 CPU能直接访问对齐的数据,当它试图访问一个未对齐的数据 ...
- C++查看大端小端模式
在学习计算机组成原理的时候,看到大端小端模式,便想实验一下,首先介绍一下 C 中的union,这个平时用得少,估计在单片机这种可能会运用,在平时写代码的时候几乎是用不着union的. union:联合 ...
随机推荐
- I Think I Need a Houseboat 分类: POJ 2015-06-11 17:52 12人阅读 评论(0) 收藏
I Think I Need a Houseboat Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 92090 Acce ...
- 编译器错误消息: CS0016: 未能写入输出文件“c:/Windows/Microsoft.NET/Framework/v2.0.50727/....dll”--“拒绝访问。
错误如下: “/”应用程序中的服务器错误. 编译错误 说明: 在编译向该请求提供服务所需资源的过程中出现错误.请检查下列特定错误详细信息并适当地修改源代码. 编译器错误消息: CS0016: 未能写入 ...
- 基于Node的PetShop,RESTful API以及认证
前篇 - 基本认证,用户名密码 后篇 - OAuth2 认证 由于宠物店的业务发展需要,我们需要一种更加便捷的方式来管理日益增多的宠物和客户.最好的方法就是开发一个APP,我可以用这个APP来添加.更 ...
- mvcAPI (入门 1)
步骤: 1)建立order 类 2)建立OrderEntity类 3)创建控制器API 这时候能看到Json 格式的数据啦 5)想在网页或客户端显示 添加一个网页 如下: <!DOCTYPE h ...
- myeclipse页面编辑框空格、回车符、对齐出现特殊字符
myeclipse页面编辑框空格.回车符.对齐出现特殊字符 解决办法:window-preferences-general-editors-Text Editors 把show whitespa ...
- UVA 10341 Solve It 二分
题目大意:给6个系数,问是否存在X使得等式成立 思路:二分.... #include <stdio.h> #include <math.h> #define EEE 2.718 ...
- iOS framework
(一),lipo 命令 1)合并文件: lipo -create xxxX/liblibsql.a xxxx/liblibsql.a -output libsql.a 2)查看Framework 对C ...
- jquery之wrap(),wrap(),unwrap()方法详解
[注]wrap():为每个匹配元素外面添加指定的HTML结构, wrapAll(): 为所有匹配元素(作为一个整体)外面添加一个指定的HTML结构 原文地址:http://www.365mini.co ...
- Codeforces Round #250 (Div. 2)A(英语学习)
链接:http://codeforces.com/contest/437/problem/A A. The Child and Homework time limit per test 1 secon ...
- Python基础学习笔记(九)常用数据类型转换函数
参考资料: 1. <Python基础教程> 2. http://www.runoob.com/python/python-variable-types.html 3. http://www ...