大端存储二进制数据,为什么计算机存储数据用十六进制
一、大小端模式
加3g实验室的艰难之旅,遇到一道这样的实验室面试题:
**输出结果为2000000**
原题对a强制转换为int,64位机指针长度为八个字节,所以改为long int。
先来分析一下表达式,a为数组a[0]的地址,强制转换为长整型变为地址的数值后加一,实际为第一个元素的第二字节地址的数值。后转换为一指向整型的指针并赋值给ptr2。整型为4个字节,从第一元素第二字节开始往后读取四个字节,间接访问得出此四个字节代表的数值,并以十六进制输出。
那么问题来了,为什么是2000000,数组的整型元素在内存中是怎么储存的?这四个字节内存的是怎样的二进制数?为什么会这样储存?
经过度娘的帮助,它终于出现了——大小端模式。
大端模式
大端模式是指数据的高位,保存在内存的低地址中,而数据的低位,保存在内存的高地址中。大端模式与我们的阅读习惯相同。
小端模式
小端模式是指数据的高位保存在内存的高地址中,而数据的低位保存在内存的低地址中。
举例
int a=2;
地址:小----->大
在大端模式中,a存为:
0x00 0x00 0x00 0x02
在小端模式中,a存为:
0x02 0x00 0x00 0x00
在计算机系统中,地址是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8**t。但是在C语言中除了一个字节(8**t)的char之外,还有两个字节(16**t)的short型等超过一个字节的数据类型。另外,对于位数大于 8位的处理器,由于寄存器宽度大于一个字节。所以必然存在如何将多个字节安排的问题,因此就有了大端存储模式和小端存储模式。
小说《格列夫游记》中,小人国内部分裂成Big-endian和Little-endian两派,区别在于一派要求从鸡蛋的大头把鸡蛋打破,另一派要求从鸡蛋的小头把鸡蛋打破。斯威夫特借以讽刺英国的政党之争,在计算机工业中指数据储存顺序的分歧。
一个简单的判断数据储存模式为大端模式还是小端模式。
a[5]={1,2,3,4,5};
第一个元素和第二个元素储存方式
(地址:小--->大)
大端模式下:
0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x02
小端模式下:
0x01 0x00 0x00 0x00 0x02 0x00 0x00 0x00
截取第二个字节到第五个字节
大端模式:
0x00 0x00 0x01 0x00
小端模式:
0x00 0x00 0x00 0x02
读取数据
大端模式:
从高地址往低地址读取
0x00 0x00 0x01 0x00
读取数据转换为十六进制为100
小端模式:
从低地址往高地址读取
0x00 0x00 0x00 0x02
排成大端(0x02 0x00 0x00 0x00)
读取数据转换为十六进制为2000000
所以在大端模式下,结果为100。
在小端模式下,结果为2000000。
学C学得好迷啊,心好累,哈哈哈哈哈。
二、存储芯片的组成
存储体由哪些组成
存储体由许多的存储单元组成,每个存储单元里面又包含若干个存储元件,每个存储元件可以存储一位二进制数0/1。
存储单元:
存储单元表示存储二进制代码的容器,一个存储单元可以存储一连串的二进制代码,这串二进制代码被称为一个存储字,代码的位数为存储字长。
在存储体中,存储单元是有编号的,这些编号称为存储单元的地址号。而存储单元地址的分配有两种方式,分别是大端、大尾方式、小端、小尾方式。
存储单元是按地址寻访的,这些地址同样都是二进制的形式。
MAR
MAR叫做存储地址寄存器,保存的是存储单元的地址,其位数反映了存储单元的个数。
用个例子来说明下:
比如有32个存储单元,而存储单元的地址是用二进制来表示的,那么5位二进制数就可以32个存储单元。那么,MAR的位数就是5位。
在实际运用中,我们知道了MAR的位数,存储单元的个数也可以知道了。
MDR
MDR表示存储数据寄存器,其位数反映存储字长。
MDR存放的是从存储元件读出,或者要写入某存储元件的数据(二进制数)。
如果MDR=16,,每个存储单元进行访问的时候,数据是16位,那么存储字长就是16位。
主存储器和CPU的工作原理
在现代计算中,要想完成一个完整的读取*作,CPU中的控制器要给主存发送一系列的控制信号(读写命令、地址译码或者发送驱动信号等等)。
说明:
1.主存由半导体元件和电容器件组成。
2.驱动器、译码器、读写电路均位于主存储芯片中。
3.MAR、MDR位于CPU的内部芯片中
4.存储芯片和CPU芯片通过系统总线(数据总线、系统总线)连接。
三、为什么计算机存储数据用十六进制
*计算机存储数据是二进制形式,二进制每8位为一个字节,如你的例子:
十进制二进制
41715 1010 0010 1111 0011
十六进制 A 2 F 3
*右边的是低位,标记为第0位,向左边一位是第1位,这样一直到这个数据的第15位。
第0~7位11110011是这个数据的低位字节(因其包含的所有位号均小于其他字节),10100010是高位字节(8~15位)。
*计算机存储小单位是字节,存储顺序(小端模式)为低位字节在前、高位在后:
11110011,10100010即十六进制标记为F3,A2两个字节。计算机在读取这两个字节到整形变量时也会自动将F3装载到变量的0~7位,而将A2装载到高位字节的。
*这是一种约定,由于存在两种模式,即大端模式和小端模式,以上这种先存低位字节的叫小端模式,大端模式则先保存高位字节,如果你遇到大端模式的CPU和*作系统,那么你的数据就会保存成A2,F3了。
*大部分CPU均采用小端模式存储数据,内存中和其他存储介质(Flash、硬盘、光盘等)中存放数据的方式均是是统一的。