以前就简单据说过电脑的大小端之分,还有经过程序来判断你的电脑是大端仍是小端。今天在学习网络的时候又接触了大小端,这里就再给你们详细的介绍一下电脑的大小端。node
首先,介绍一下什么是大端什么是小端。大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿相似于把数据看成字符串顺序处理:地址由小向大增长,而数据从高位往低位放;这和咱们的阅读习惯一致。linux
小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中.编程
大端存储:高字节存储在低地址中,即高位先存;windows
小端存储:低字节存储在高地址中,即低位先存;网络
那这个大小端到底有什么区别,对咱们编写程序有什么影响呢?这在咱们正常编程下都是没有问题的也没有什么影响,可是当咱们在跨平台进行操做的时候,假如咱们在程序中进行了位运算,颇有可能咱们在当前小端平台下测试没有问题,可是在大端平台下就会使程序出现bug。咱们目前经常使用的linux和windows都是小端系统。这些基本的小知识咱们要作到了解。学习
最重要的是咱们要学会经过程序来判断当前的机器是大端仍是小端。下边给你们介绍几个判断程序大小端的方法。测试
咱们后边的程序都会用到定义的十六进制数据这里咱们先将他在大小端机器中内存中是如何存放的画出来。spa
第一种方法: 指针
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那当前条件下就是小端存储。code
第二种方法:
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类型也就能够分辨出机器是大端仍是小端了。