判断大小端的方法
(2017-10-13 11:22:56)分类: my_work |
大端模式(Big-endian):
是指数据的低位(就是权值较小的后面那几位)保存在内存的高地址中,而数据的高位,保存在内存的低地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;
小端模式(Little-endian):
是指数据的低位保存在内存的低地址中,而数 据的高位保存在内存的高地址中,和我们的逻辑方法一致。
判断大小端方法:1、利用指针强制类型转换;
1、利用指针强制类型转换
[cpp] view
plain copy
-
#include
-
int
main() -
{
-
int a = 1; -
char * char*)&a;p = ( -
if (*p == 1) -
{ -
printf("little-endian"); -
} -
else -
{ -
printf("big-endian"); -
} -
return 0; -
}
如果小端方式中(i占至少两个字节的长度)则i所分配的内存最小地址那个字节中就存着1,其他字节是0;大端的话则1在i的最高地址字节处存放。char是一个字节,所以强制将char型量p指向i则p指向的一定是i的最低地址,那么就可以判断p中的值是不是1来确定是不是小端。
2、利用共用体所有数据共用同一块地址空间
[cpp] view
plain copy
-
#include
-
union
A -
{
-
char c; -
int a; -
}A;
-
int
main() -
{
-
A.a= 1; -
if (A.c == 1) -
{ -
printf("little-endian"); -
} -
else -
{ -
printf("big-endian"); -
} -
return 0; -
}
3、直接判断法
第三种称之为直接判断法,怎么直接判断呢,其实就是根据大小端各自的存储方式编写程序进行判断,这个方法更直接。
首先我们来看下大小端的存储方式:
大端模式(Big_endian) --
字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。
小端模式(Little_endian)-- 字数据的高字节存储在高地址中,而字数据的低字节则存放在低地址中。
根据这个特性,假设我们初始化了一个int变量i为0x12345678,其地址为0x100,根据定义在小端模式下
0x100一个字节内的值为0x78,类推0x101=>0x56,0x102=>0x34,0x103=0x12,根据这个编程如下
我曾经在面试中被问及该问题,当时我用的是第一种方法,用口述方式进行的,我还没陈述完,面试官就笑着说看来你是在网上看到了这样的方法,自己的理解不够深入! 他的话其实有点武断,用第一种方法并不表明我就没有深入理解大小端。
首先我们来看下大小端的存储方式:
大端模式(Big_endian)
小端模式(Little_endian)-- 字数据的高字节存储在高地址中,而字数据的低字节则存放在低地址中。
根据这个特性,假设我们初始化了一个int变量i为0x12345678,其地址为0x100,根据定义在小端模式下
0x100一个字节内的值为0x78,类推0x101=>0x56,0x102=>0x34,0x103=0x12,根据这个编程如下
-
intcheckSystem2( void) -
{
-
int i 0x12345678;= -
char *c = &i; -
return ((c[ 0]== 0x78)&& 1](c[ == 0x56)&& 2](c[ == 0x34)&& 3](c[ == 0x12)); -
}
[java] view
plain copy
-
int
main( void) -
{
-
if(checkSystem2()) -
printf("little endian\n" ); -
else -
printf("big endian\n" ); -
-
return 0; -
}
如果返回1表示小端,反则表示大端;
我曾经在面试中被问及该问题,当时我用的是第一种方法,用口述方式进行的,我还没陈述完,面试官就笑着说看来你是在网上看到了这样的方法,自己的理解不够深入! 他的话其实有点武断,用第一种方法并不表明我就没有深入理解大小端。
但是人都有主观判断性,面试官对我主观的印象就这样了!
所以以后面试还被问到就用第二种方法吧,这个描述起来,对方替听起来你总算是理解了大小端的本质就是存储方式!
所以以后面试还被问到就用第二种方法吧,这个描述起来,对方替听起来你总算是理解了大小端的本质就是存储方式!