判断大端或小端

      当前的存储器,多以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: 0
Litte End: 1
4 3 2 1



Reference:

1,http://www.cnblogs.com/Romi/archive/2012/01/10/2318551.html

2,http://www.cnblogs.com/berry/articles/1588084.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值