本节文章分别属于《Win32 学习笔记》和《MFC 学习笔记》两个专栏,故划分为两个专栏导航。读者可以自行选择前往哪个专栏。
上一篇:计算机基础:二进制基础13,十六进制与二进制的相互转换
回到目录
下一篇:计算机基础:编码02,有符号数编码,原码
上一篇:计算机基础:二进制基础13,十六进制与二进制的相互转换
回到目录
下一篇:计算机基础:编码02,有符号数编码,原码
在之前的章节中,我讲解了进制知识。进制的知识,我将其归类为计算机基础。
从本节开始,我们开始讲解计算机中的编码知识。编码知识,我仍然将其归类为计算机基础。
在一台计算机中,需要存储各种各样的信息,包括数字,文本,图形,视频,音乐等等。不论存储的是什么信息,在计算机中所保存的,都是数字而已。
在学习 C 语言的时候,我们知道,一个整数数据类型,可以分为两种,一种是无符号类型,另外一种是有符号类型。
比如说整型,可以分为 unsigned int 和 signed int 两种类型。其中,signed int 常常被简写为 int 。
短整型,字符型,长整型,也都分为无符号和有符号两种情形。
无符号数的存储,是比较简单的,同时,它也是比较基础的。
我们对计算机编码知识的讲解,从无符号数开始
无符号数,所表示的东西,其实就是自然数。无符号中不存在负数,只有大于或等于 0 的整数。
对于无符号数的编码,其实就是将一个数,转为对应的二进制形式。这个转换好了的二进制形式,就是这个数的无符号编码。
无符号数,按照所占据空间的大小,通常可以分为无符号字符型,无符号短整型,无符号整型,无符号长整型等几种类型。
本节,主要是为了说明问题,所以,不采用无符号整型与长整型,仅采用无符号短整型和无符号字符型。
首先呢,我们来看看 103 这个数,它在计算机中,是怎么保存的呢?假定它是一个无符号字符型数据。
对于 103 这个十进制数,我们可以通过除k取余法,将其转化为二进制数。其中,k 等于 2 。
关于如何将一个十进制数转换为二进制数的问题,我们之前是有讲过的。大家如果还不会这个方法,可以查看下述链接所示的文章。
计算机基础:二进制基础04,十进整制数转化为二进制整数
十进制数103 的对应二进制数为 0110 0111 。
所以,当计算机存储十进制整数 103 的时候,所存储的内容,正是 0110 0111 。因为计算机只认识 0 和 1,只处理二进制数,所以,在计算机中,存储十进制数 103 的时候,存储的内容,是二进制的编码 0110 0111,而非十进制编码 103。
注意,在这里,书写这个二进制数的时候,我略微作了一点美化,原本的数应该是 01100111,中间不带空格。可是,这么多的 0 和 1,如果没有四个一组的划分,并且在不同的组之间加上空格的话,那么,这个数可能就会难以辨认了。所以,我们略微将其作了一点美化,将这个整数从右边数,每四个数为一组,最左边的一组,不论是否满 4 哥,也都算作一组。在组与组之间,还要加上一个空格。
在之前的章节中,我也讲了十六进制数与二进制数的转换的方法。
一般地,我们在描述二进制数的时候,不是直接写出其二进制形式,因为数位一旦很多的话,二进制形式就会非常地冗长,难于辨认和修改。
比如说 3912345 这个数,它的二进制形式是这样的:0011 1011 1011 0010 1001 1001
这还只是一个数,如果是好多好多的数,那么,这众多的 0 和 1,足以令人眼花缭乱了。所以呢,在平时,我们自己去描述二进制数的时候,常常采用十六进制数,来表达它。
十进制数 103 的对应二进制数为 0110 0111,它对应的十六进制数为 67 。
二进制转换为十六进制数的方法,如果你还不会,可以查看下面的链接所示的文章。
计算机基础:二进制基础13,十六进制与二进制的相互转换
将一个十进制数转换为二进制的方法,在下面的链接中有讲解。
计算机基础:二进制基础04,十进整制数转化为二进制整数
将一个二进制数转换为十六进制的方法,在下面的链接中有讲解 。
计算机基础:二进制基础13,十六进制与二进制的相互转换
接下来,我们来看例题
首先呢,采用除 2 取余法,将十进制数 34056 转换为二进制数,结果为:1000 0101 0000 1000 。它对应的十六进制数为:8508 。其中,二进制编码为计算机中存储的 34056 的形式,而十六进制数则是我们为了方便描述,所采用的标记方法。
首先呢,采用除 2 取余法,将十进制整数 134 转换为二进制数,结果为:1000 0110 。它对应的十六进制数为:86 。二进制编码为计算机中存储的 134 的形式,而十六进制数则是我们为了方便描述,所采用的标记方法。
这个,要看我们在申请变量的时候,指定的数据类型是什么。对于无符号字符型 unsigned char,我们用 8 位来存储。对于无符号短整型,那就是用 16 位来存储着了。
在例题 1 和 2 中,我们对例题 1 采用了 16 位的存储,而对例题 2 采用了 8 位存储。这个是因为,34056 这个数,8 位是招不下的,需要用 16 位来存储它。而 134 这个数,用 8 位就可以招下了。
我们在学习 C 语言的时候,其实就已经知道了,8 位无符号整数的数值范围,是 0 ~ 255 。而 16 位无符号整数的数值范围,是 0 ~ 65535 。
为啥是这么两个范围值呢?
8 位无符号整数,最小的是 0000 0000,最大的是 1111 1111,这俩二进制数分别对应着 0 和 255 。
16 位无符号整数,最小的是 0000 0000 0000 0000,最大的是 1111 1111 1111 1111,这俩数分别对应着 0 和 65535 。
我们在处理例题 1 和例题 2 的时候,本着尽量节省空间的原则,所以,对 134 采用了 8 位的存储方式,而对 34056 采用了 16 位的存储方式。
当然了,在实际的 C 语言编程中,我们应该不太会考虑着这种小空间的节省,而是会一律采用 int 型变量。
而在这里,我们不太方便用 int 型,因为实在是太冗长了。为了说明无符号数的编码问题,采用 8 位 和 16 位,足以说明问题,也就可以了。
本节,我们讲解了无符号数的计算机编码的问题,下一节,我们开始来讲解有符号数的编码。
本节文章分别属于《Win32 学习笔记》和《MFC 学习笔记》两个专栏,故划分为两个专栏导航。读者可以自行选择前往哪个专栏。
上一篇:计算机基础:二进制基础13,十六进制与二进制的相互转换
回到目录
下一篇:计算机基础:编码02,有符号数编码,原码
上一篇:计算机基础:二进制基础13,十六进制与二进制的相互转换
回到目录
下一篇:计算机基础:编码02,有符号数编码,原码