A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

小敏叫我来巡山

初级黑马

  • 黑马币:21

  • 帖子:5

  • 精华:0

本帖最后由 小敏叫我来巡山 于 2017-11-7 22:30 编辑

一.计算机数据存储的基础知识
   1.计算机存储器的基本单位 :
     计算机中最小的存储单元是bit,也叫做位,表示两种状态,可以存储1或者0,它存在于物理内存上。
     计算机使用8bit的块来作为最小可寻址的存储单位,这个存储单位叫做字节(Byte)。
     从程序的视角来看,内存是一个非常大的字节数组,程序的虚拟地址即为每个子节在数组中的下标。


   2.什么是机器字(word)?
     一般来说,机器字是cpu内部总线的宽度。平常说的32位机和64位机,指的就是计算机机器字的长度
     机器字长度决定了cpu一次运算能够处理数据的最大宽度,一般也决定了cpu所能访问内存的地址范围。
     例如,32位机器字长的cpu一次传输的数据能表示的范围是0~2^32-1Byte,
     那么如果想传输一次地址就能访问内存的话,内存的大小就不能超过这个范围,
     这个范围就是我们平常说的程序的地址空间0~4G
     
     机器字长对程序来说意味着什么?
     举例来说,当程序prog.c被编译成32位程序时,可以在32位或者64位机器上运行
     (大多数64位机器也可以运行32位机器编译的程序,这是一种向后兼容。)
     当它被编译成64位程序时,那就只能在64位机器上运行。
     因此,当我们将程序称为“32位程序”或者“64位程序”时,区别在于该程序是如何被编译的。


   3.存储数据的字节顺序(大端和小端)
     考虑我们要存储一个跨越多个字节的数据,例如int型数据。
     为了我们能够正确的取出这个数据,我们需要确定两条规则:
     1.选取哪个字节表示这个数据的地址,以便于我们知道从哪取出数据。
     2.在这个数据存储区域的内部怎么排列这些字节,以便于我们把这些字节重新还原成数据。
          关于第一条规则:在几乎所有的机器上,数据的地址都为所使用字节中最小的地址。
          通常说的大端小端之分,就是关于怎么实现第二条规则,例如我们要存储0x01234567:
         
     file:///C:/Users/SOLUTI~1/AppData/Local/Temp/enhtmlclip/Image.png   
          通俗的说法,小端就是低地址存储低位,高地址存储高位,大端正好相反。
          定义比较麻烦,大家可以从图中自行体会。


     注意,计算机中数据存储是大端字节序还是小端字节序,是由cpu决定的,
          例如,通常intel的cpu采用的是小端字节序。


    说了这么多理论,我们来写段代码验证下自己的机器是什么字节序吧:


     int is_little_endian(void) {
          /* MSB = 0, LSB = 1 */
          int x = 1;
          /* Return MSB when big-endian, LSB when little-endian */
          return (int)(*(char *)&x);
     }
     
     术语:LSB = Least Significant Bit 最低有效位
          MSB = Most Significant Bit  最高有效位





1 个回复

倒序浏览
棒棒哒
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马