笔试面试7 如何判断一个系统的存储方式是大端还是小端

笔试面试7 如何判断一个系统的存储方式是大端还是小端,第1张

简单来说,从内存地址增加的方向来说,大端就是先存放高序字节,小端就是先存放低序字节。

例唯悉如: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

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12456276.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存