判断大端或小端
来源:互联网 发布:最美的句子知乎 编辑:程序博客网 时间:2024/04/28 09:33
当前的存储器,多以byte为访问的最小单元,当一个逻辑上的地址必须分割为物理上的若干单元时就存在了先放谁后放谁的问题,于是端(endian)的问题应运而生了,对于不同的存储方法,就有大端(big-endian)和小端(little- endian)两个描述。
大端与小端(MSB/LSB)
假设内存位置
0x4000 : 0x12
0x4001 : 0x34
表示值0x1234,那么这种方式为MSB, 即大端存储方式。
假设内存位置
0x4000 : 0x34
0x4001 : 0x12
表示值0x1234, 那么这种方式为LSB, 即小端存储方式。
简单来讲:MSB在低地址,即大端(MSB)存储。LSB在低地址,即小端(LSB)存储。
现在主流的CPU,intel系列的是采用的little endian的格式存放数据,而motorola系列的CPU采用的是big endian,ARM则同时支持 big和little,网络编程中,TCP/IP统一采用大端方式传送数据,所以有时我们也会把大端方式称之为网络字节序。
特别需要注意的是,C/C++语言编写的程序里数据存储顺序是跟编译平台所在的CPU相关的,而JAVA编写的程序则唯一采用big endian方式来存储数据。这里我就只讨论C/C++语言的情况。
方式一:bool isMSB(){/* true returned if MSB */int iVal = 0x12345678;char *pCh = (char*)&iVal;return (*pCh == 0x12);}bool isLSB(){/* true returned if LSB */int i = 0x12345678;char *c = (char*)&i;return (*c == 0x78);}方式二:
bool checkEnd(){/* true returned if LSB */union{long a;char b;} u;u.a = 1;return (u.b == 1);}
测试代码:
void main(){cout<<"Big End: "<<isMSB()<<endl;cout<<"Litte End: "<<checkEnd()<<endl;int i = 0x01020304;char *c = (char*)&i;printf("%d %d %d %d\n",*c,*(c+1),*(c+2),*(c+3));}
测试输出:
Big End: 0Litte End: 14 3 2 1
1,http://www.cnblogs.com/Romi/archive/2012/01/10/2318551.html
2,http://www.cnblogs.com/berry/articles/1588084.html
- 判断大端或小端
- 大端 小端判断
- 判断大端小端
- 大端小端判断
- 判断大端小端
- 大端小端判断
- 判断大端小端
- 小端大端判断
- 判断大端小端
- 大端、小端判断
- 大端小端判断
- 【已解决】如何判断处理器是大端,或小端?
- 大端小端判断 代码
- 大端、小端判断程序:
- 判断大端小端模式
- 大端小端的判断
- 大端小端的判断
- c++大端小端判断
- Ruby Regexp using gsub is there an equivalent to self keyword?
- SVN update Failed . Locked
- Beginning Python Chapter 27
- cocos2dx挖掘
- IntelliJ IDEA 代码提示的问题
- 判断大端或小端
- 读mybatis源码之二:构建SqlSession逻辑
- 有用的开源库支持
- 三分搜索——初见
- 装大神开博客
- 多态(动态绑定)
- 怎样养成良好习惯
- C# 打开一个新进程
- VS2012 查看项目的总代码行数