大小端模式完全剖析

小端模式:高位在高地址,低位在低地址(简单记为:高高低低)

大端模式:高在低,低在高

 

          一般来说,Intel芯片都是小端模式的,我的电脑用的是Intel的CPU, 对于整数0x12345678, 其在内存中的排列为:

#include 
using namespace std;

int main()
{
	int n = 0x12345678;
	int *p = &n;
	char *q = (char *)p;
	printf("%x %p\n", *q, q);
	printf("%x %p\n", *(q + 1), q + 1);
	printf("%x %p\n", *(q + 2), q + 2);
	printf("%x %p\n", *(q + 3), q + 3);
 
	return 0;
}

       结果:

78 0013FF7C
56 0013FF7D
34 0013FF7E
12 0013FF7F


      那么, 我们该如何判断大小端呢? 下面, 给出一个最简单的程序:

#include 
using namespace std;

bool isLittleEndian()
{
	int n = 0x01020304;
	char *p = (char *)&n;

	if(4 == *p)
	{
		return true;
	}

	return false;
}

int main()
{
	if(isLittleEndian())
	{
		cout << "little endian" << endl;
	}
	else
	{
		cout << "big endian" << endl;
	}

	return 0;
}

       当然, 有的书上用了共用体, 其实也是可以的。



       想法1:最近, 突然想到tcp/ip网络通信时, 就是用的大端字节序, 那么是否可以用if(htonl(n) == n)来验证大小端系统呢? 我认为是可以的。

       想法2:另外, 下面程序可否验证大小端系统呢?

#include 
using namespace std;

bool isLittleEndian()
{
	int n = 0x01020304;
	char c = n;

	if(4 == c)
	{
		return true;
	}

	return false;
}

int main()
{
	if(isLittleEndian())
	{
		cout << "little endian" << endl;
	}
	else
	{
		cout << "big endian" << endl;
	}

	return 0;
}
      我认为是不可以的, char c = n;的转换应该是跟大小端无关的。


      哪里去搞个大端系统呢? 有大端系统的朋友, 帮我验证一下啊。




你可能感兴趣的:(S1:,C/C++,s2:,软件进阶)