第十课_数据宽度

前言

  第九课中就提到了数据宽度这个词,这节就来说说数据宽度吧。前方高能,特别是那些熟记什么是原码、反码、补码的同学,或许会颠覆你们的看法。

  其实这节课是说计算机是怎么存数的,可能有人觉得很简单。别急,既然觉得简单,那就先来解释我们电脑中计算器的这个现象。

  找开电脑的计算器,切换到程序员模式,如下图

第十课_数据宽度

然后输入-3,或者输入2-5看看自己可以解释为什么十六进制、十进制、八进制、二进制为什么不一样?还有就是你用你那传统的方法转一下十六进制的‭FFFFFFFFFFFFFFFD‬,转成十进制,看看结果是不是-3

第十课_数据宽度

  还是别转了,看着心疼。

  其实在计算机的世界里,存放的数据只有0和1,至于存在计算机中的数表示什么,是由使用计算机的人说了算,例如这个-3,它在计算机中保存的是1111111111111111111111111111111111111111111111111111111111111101‬,至于它要表示成-3,还是十六进制的FFFFFFFFFFFFFFFD,完全是由我们人说了算,但它在计算机中保存的数是一样的。

  在数学中,我们的数字是没有大小限制的,理论上,只要你脑子够强大或者稿纸够大,你是可以计算出1千亿乘以1千亿的。但是在计算机中,由于受到硬件的制约,数据是有长度限制的,这就是我们所说的数据宽度,超过限定的宽度,数据就会被丢弃。这也是我们进行强制类型转换时,有时候会失真的原因(没学过编程的,此句可以忽略)。下面以四位宽度作详细介绍。

四位宽度

  如果计算机只能存4位的二进制数,即401

  这4位0116种组合

第十课_数据宽度

为了便于理解,我们用一个圆来表示这16个数,如下图

第十课_数据宽度

  当数据从左下角的0开始顺时针走一圈,到F处,如果再向前一步(即F + 1),那么它就变成了0,(也可以这样理解,F + 1 = 10000,由于计算机这时只能保留4位,所以前面的1被丢弃了,只剩下0000)。

  下面说一下有符号数、无符号数,有编程经验的同学可能知道,有符号数,简单理解就是把数分成的正数和负数。无符号数是相对于有符号数来说的,可以简单理解为只是正数,没有负数,负数有个“-”(负号)嘛。

  在计算机中无符号数,就是它本来的数。

  那在计算机中如何表示有符号数呢。

第十课_数据宽度

  因为它们各占一半,最简单的分法就是把能够表示的数分成两半,一半表示正数,另一半表示负数。最简单的,就是把这个圆分成两半,右边表示正数,左边表示负数。

第十课_数据宽度

  像这种分法,老一辈服务于计算机的人就这么规定的。

  看那个圆左边,虽然表示负数,但是它们在计算机中的保存的数据是没有变的。例如在计算机中保存的是1111,如果你把它看成有符号的,那么它就是-1,如果你把它看成无符号的,那它就是F。至于是有符号的,还是无符号的,完全是由我们使用的人说了算,计算机很单纯(比漂亮的女生还要单纯),它就只保存着1111

  之前学过编程的可能知道这么一个概念,有符号数中,对应的二进制数的第一位数是1,那么它就是负数。确实是这样,从8F,它们二进制的第一位数确实是

  理解了那个圆,可以帮助你解决很多问题,至于那些原码、反码、补码,都是后人总结的经验,只要了解了那个圆,那些复杂的概念,可以有用理

  为了让大家更好的理解,下面多举几个其他宽度的。

八位宽度

  八位宽度表示数,假设计算机只能存8位二进制数,那么这个圆可以是下面这样的。

第十课_数据宽度

  对应的正负数的划分也是从中间分成两边。

第十课_数据宽度

十六位宽度

  十六位宽度也就是用16位的01表示数。

第十课_数据宽度

32位宽度

  32位宽度也就是用32位的01表示数。这也是我们真实计算机常用的宽度。

第十课_数据宽度

 

最后的重点

  上面讲了那么多无非想引出真实计算机中的几个重要的计量单位。

字节:宽度是8位,即只有801。在汇编中用BYTE表示。

字:宽度是16位,即只有1601。在汇编中用WORD表示。字等于2个字节。

双字:宽度是32位,即只有3201。在汇编中用DWORD表示(DDouble)。双字等于2个字,等于4个字节。

 

​写于2020.3.17 23:23