例唯悉如:0x0102
-------->内存增加的方向------>
地址A------>地址A+1
大端:0102
小端:02 01
判断方法是利用union的一个特性,厅唯那就是里面的变量共享一段内存。
可以定义一个union.
union Test{
short num//2byte
char c[sizeof(num)]//2byte
}
然后存入一个0x0102或者其他数字到test.num中,因为共享内存的原因,可以访问c[1],c[2],查看里面的值来判断大小端。
一个实现是(参照unix网络编程中的一个例子):
[cpp] view plain copy print?
#include <stdio.h>
#include <conio.h>
union Test{
short num
char c[sizeof(short)]
}
int main()
{
union Test t//C++ 直接声明为Test t即可
t.num=0x0102
if(t.c[0]==1&&t.c[1]==2)
printf("大端!\n")
else if(t.c[0]==2&&t.c[1]==1)
printf("小端!\n")
else
printf("未知!\n")
getch()
return 0
}
在Win7 32bit里面用DEV c++运行的结果指伏乎为:
或者更简单的是存一个short值,然后取其地址。
[cpp] view plain copy print?
#include <stdio.h>
#include <conio.h>
int main()
{
short int num=0x0201
char *p=#
if(*p==0x02)
printf("大端!\n")
else if(*p==0x01)
printf("小端!\n")
else
printf("未知!\n")
getch()
return 0
}
测试结果:
#include <stdio.h>union utype
{
局戚碰int i
char a
}
void main()
{
union 仔巧utype u
u.i = 1
if (u.a)
桐谈printf("小端\n")
else
printf("大端\n")
}
什么是岁梁大/小端呢?所谓大端就是指高位值在内存中放低位配耐地址,所谓小端是指低位值在内存中放低位地址。比如0x11223344在大端机上是11223344,在小端机上是44332211,而一个机器是大端还是小端要看cpu类型以及运行在上面的 *** 作系统。同一款cpu在不同的 *** 作系统使用的大小端情况是不同的。当然我们通常使用的x86+windows是小端。那如何测试大小端呢?
通常的技巧是使用一个指针:如:
[cpp] view plaincopy
int x = 1
if(*(char *)&x == 1)
printf("little-endian\n")
else printf("big-endian\n")
或者使用union的特性。union是一个联合体,所有变量公用一乎卖运块内存,只是在不同的时候解释不同。其在内存中存储是按最长的那个变量所需要的位数来开辟内存的。如:
[cpp] view plaincopy
#include <iostream>
using namespace std
union
{
int number
char s
}unionTest
bool IsBigEndin()
{
unionTest.number = 0x01000002
return (unionTest.s == 0x01)
}
void main()
{
if (IsBigEndin())
cout<<"big-endian"<<endl
else
cout<<"little-endian"<<endl
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)