机器大小端存储问题


今天在进行计算机组成原理实验的过程中,偶然回想起老师上课讲起的关于机器大小端的问题,遂进行一番探究

机器在存储字节的时候一般有两种存储方式,一种是大端存储,一种是小端存储

大端存储(百度百科)

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

小端存储(百度百科)

小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。

如何正确理解,举个例子

假设有一值为 0x12345678,那么如果是在大端机器(符合人类阅读方式)里面存储的话那么从地址00开始的话应该是00(12)、01(34)、02(56)、03(78),这样的存储方式十分符合人类的阅读习惯,但不利于机器的处理。

若为小端机器的话,那么从地址00开始则为00(78)、01(56)、02(34)、03(12)。这样的存储方式虽然有点反人类,但机器很喜欢,因为处理更加方便,所以现在的大多数机器例如:windows、linux等都是采用的小端存储。

这里写图片描述

光说不练假把式,上代码
在下有两种测试机器大小端的代码,一种是采用指针,一种则为联合体。

指针法

#include<stdio.h>
int main()
{
int num = 0x12345678;
char*p;
p = (char*)&num;
if (*p == 0x78)
printf("the pc is little-big");
else printf("the pc is big-little");
return 0;
}

这里写图片描述

联合体法
何为联合体请百度百科

#include<stdio.h>
int main()
{
union {
int a;
char b;
}c;
c.a=0x12345678;
c.b=c.a;
if(c.b==0x78)
printf("the pc is little-big");
else printf("the pc is big-little");
return 0;
}

这里写图片描述

总结
本次实验的是大小端问题,机器都是从地址小的开始读取的,而不是从数值小的开始读取的,这个概念需要得到了解对于现在的绝大多数机器而言,小端存储无疑是主流,因为小端对于机器的处理有着先天的优势,当然大端存储也是有优势的,比如方便人类的读取,这在网络传输里得到了充分的证明,所以网络传输一般都是大端传输。

ps:如果觉得好,欢迎转载哦,http://blog.csdn.net/Mikeoperfect/article/details/72822490 (根据全文检索搜索引擎的稀疏矩阵排名算法,这样可以增加排名量哦哈哈哈)

智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告