C++判别大端小端代码,谁能解释下,THX

cppdow 2012-05-27 11:25:12

C++怎样判别大端小端
使用宏的方法:
const int endian = 1;

#define is_bigendian() ( (*(char*) &endian) == 0 )

#define is_littlendbian() ( (*(char*) &endian) == 1 )


方法二:
bool IsLittleEndian()

{

union

{

long val;

char Char[sizeof(long)];

}u;

// 1-小端(Intel); 0-大端(Motor)

u.val = 1;

if ( u.Char[0] == 1 )

{

// 小端

return true;

}

else if ( u.Char[sizeof(long)-1] == 1 )

{

// 大端

return false;

}

throw( "Unknown!" );

}
...全文
387 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
skylinesky 2012-05-29
  • 打赏
  • 举报
回复
对于方法一:
#define is_bigendian() ( (*(char*) &endian) == 0 )
endian在内存中的十六进制表示为:0x00,0x00,0x00,0x01;
&endian是取endian的地址,
*(char *)&endian是取endian首地址的值,当取到0x00时,说明endian的高位字节放在内存的低地址,那当然是端了;
对于方法二:
union联合体元素在内存中的存放是共用内存,
long 的字节表示:0x00, 0x00, 0x00, 0x01;
char 的字节表示:Char[3], Char[2],Char[1],Char[0];
他们相互对应,结果就很明显了;

可以参考博客:http://blog.csdn.net/skylinesky/article/details/7610510
rendao0563 2012-05-29
  • 打赏
  • 举报
回复

static inline int Sex()
{
const int probe = 1;
return !*(const char *)&probe;
}
AnYidan 2012-05-29
  • 打赏
  • 举报
回复
网上大把,google
楚天乐 2012-05-29
  • 打赏
  • 举报
回复
对于0x12345678
咱们用的x86体系下都是小端存储,内存布局如下
地址 :00 01 02 03
数据 :78 56 34 12

但是大端机器存储则反过来
地址 :00 01 02 03
数据 :12 34 56 78

所以你要判断是大端还是小端,只需要判断int数据的第一个自己到底存的是12,还是78。
ForestDB 2012-05-28
  • 打赏
  • 举报
回复
理解了int在内存中怎么放的,一切了然。
cppdow 2012-05-28
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20120223/10/b837bc69-38b3-408f-8321-f65deae8e83f.html
沭水河畔 2012-05-28
  • 打赏
  • 举报
回复
Kernel里的用法:
static union { char c[4]; unsigned long l; } endian_test __initdata = { { 'l', '?', '?', 'b' } };
#define ENDIANNESS ((char)endian_test.l)
qq120848369 2012-05-28
  • 打赏
  • 举报
回复
很高端的样子.

int n = 1;
int m = (int)(*(char*)&n);
if (m == 1) {

} else {

}

或者用union做,代码更短.
沭水河畔 2012-05-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

是一楼的第二种方法看不懂
[/Quote]
楼主可以查一下联合体的特点,在联合体u中,它的两个成员变量占用同样的内存地址。
还是《The C Programming Language》6.8节说的清楚:
Unions provide a way to manipulate different kinds of data in a single area of storage, without embedding any machine-dependent information in the program.
cppdow 2012-05-27
  • 打赏
  • 举报
回复
是一楼的第二种方法看不懂
cppdow 2012-05-27
  • 打赏
  • 举报
回复
下面的代码可以理解

bool IsBig_Endian()
//如果字节序为big-endian,返回true;
//反之为 little-endian,返回false
{
unsigned short test = 0x1122;
if(*( (unsigned char*) &test ) == 0x11)
return TRUE;
else
return FALSE;

}//IsBig_Endian()


69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧