判断机器大小端的方法

  之前就简单听说过电脑的大小端之分,还有通过程序来判断你的电脑是大端还是小端。今天在学习网络的时候又接触了大小端,这里就再给大家详细的介绍一下电脑的大小端。

  首先,介绍一下什么是大端什么是小端。大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。

小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中.

大端存储:高字节存储在低地址中,即高位先存;

小端存储:低字节存储在高地址中,即低位先存;

  那这个大小端到底有什么区别,对我们编写程序有什么影响呢?这在我们正常编程下都是没有问题的也没有什么影响,但是当我们在跨平台进行操作的时候,假如我们在程序中进行了位运算,很有可能我们在当前小端平台下测试没有问题,但是在大端平台下就会使程序出现bug。我们目前常用的linux和windows都是小端系统。这些基本的小知识我们要做到了解。

  最重要的是我们要学会通过程序来判断当前的机器是大端还是小端。下边给大家介绍几个判断程序大小端的方法。

 我们后边的程序都会用到定义的十六进制数据这里我们先将他在大小端机器中内存中是如何存放的画出来。

  

  第一种方法:

 int main()

{

int a = 0x12345678;

char i = a;

printf("%x", i);

system("pause");

return 0;

 

}

我们定义一个十六进制的数据,数据类型为int型,之后定义一个char类型的数据,int数据类型的大小为四个字节,而char类型的数据为一个字节,所以将int类型的数据赋值给char时会丢失三个字节的数据,char类型中存储的是int类型中低地址的数据,这时候char类型获取的数据输出之后,如果输出的是12那就说明你低地址位置的数据是12,那就说明你的数据是大端存储,如果输出的结果是78那当前条件下就是小端存储。

第二种方法:

int main()

{

int a = 0x12345678;

char *c = (char *)&a;

printf("%x", *c);

system("pause");

return 0;

 

}

第二种方法和第一种类似,不过这里是通过指针来实现的,本质上是没有任何区别的。

第三种:

 

typedef union NODE

{

int i;

char c;

}Node;

 

int main(int argc, char *argv[])

{

Node node;

 

node.i = 0x12345678;

printf("%x\n", node.c);

system("pause");

return 0;

}

第三种相对复杂一些,用到了我们之前所学到的联合体,联合体有一个最大的特点就是内存公用,在这个联合体中,所有数据的内存是公用的这一部分。所以这里我们定义了一个联合体node,其中有两个数据一个是i是int类型的,另一个是char类型的c当我们给int类型的数据赋值时,char类型的数据也会有相应的值不过int类型读取的是连续四个字节的数据,但是char类型的只是读取的一个字节的数据,这样通过输出char类型也就可以分辨出机器是大端还是小端了。

 

猜你喜欢

转载自blog.csdn.net/Hanani_Jia/article/details/81390484