计算机基础:编码02,有符号数编码,原码

专栏导航

本节文章分别属于《Win32 学习笔记》和《MFC 学习笔记》两个专栏,故划分为两个专栏导航。读者可以自行选择前往哪个专栏。

(一)WIn32 专栏导航

上一篇:计算机基础:编码01,无符号数编码

回到目录

下一篇:计算机基础:编码03,根据十进制数,求其原码

(二)MFC 专栏导航

上一篇:计算机基础:编码01,无符号数编码

回到目录

下一篇:计算机基础:编码03,根据十进制数,求其原码

本节前言

上一节,我是讲解了无符号整数数的编码。无符号整数的编码还是比较简单的。相比无符号整数,有符号整数,就要复杂一些了。

计算机使用补码这种编码来表示有符号整数。

所谓的有符号整数,它包含了正整数,负整数和 0 ,而无符号整数,仅包含 0 和正整数。

有符号整数的表示方法,还是需要点时间,来理解的。

我们的目的,是教会大家补码这种编码。然而,为了让大家理解补码知识,我们首先需要学会原码和反码两种编码。

下面,我们就来讲解原码。

一.    原码的数据结构

关于数据结构,我想,很多同学在学习完了 C/C++ 以后,应该是接触过吧?链表,二叉树,图结构,还有与某种数据结构相对应的算法。我想,这种数据结构与算法的知识,许多同学应该是学过的。

Win32 与 MFC 知识,虽说不是系统底层的知识,但是它也接近于系统底层知识。如果,在此时,你还不会数据结构与算法的知识,那么,本课程的学习,你可能就得多花点时间了。

其实,即使你已经学会了基本的数据结构与算法知识,学习 Windows 编程,依然不是一件轻松的事情。

或许,本教程并不要求大家必须具备数据结构与算法的知识,但是呢,最好呢,你能够具备数据结构与算法这一基础。

在很长的时间里,我应该不会去讲解数据结构与算法的知识。所以呢,这一块知识的学习,还是要求大家自己去找教程来学习了。

或许,当初大家在学习数据结构的时候,学得很吃力。然而,我们本节所说的数据结构,跟 C/C++ 里面的数据结构,还不是一回事。我们这里所说的数据结构,比那个要简单多了。

原码有两个字段,最高位是符号位,它表示一个整数的符号。若是符号位为0,则表示正整数或者  0 。如果符号位为 1,则表示负数。

在计算机里面,可以有多种数据类型的有符号数。有单字节的 char 型,有双字节的 short 型,有四字节的 int 型,还有八字节的 long 型。

对于 char 型来讲,它包含 8 个二进制位,其中最高位是位 7,那么,位 7 便是 char 型整数的符号位。

对于 short 型来讲,它包含 16 个二进制位,其中最高位是位 15,那么,位 15 便是 short 型整数的符号位。

对于 int 型来讲,它包含 32 个二进制位,其中最高位是位 31,那么,位 31 便是 int 型整数的符号位。

对于 long 型来讲,它包含 64 个二进制位,其中最高位是位 63,那么,位 63 便是 long 型整数的符号位。

原码的一个字段是符号位,而另一个字段,便是数值位了。

无论一个有符号数是多少位的,它的组成都是分为两部分。最高位为符号位,其余位便是数值位。

我们来看一下 char 型数的数据结构表格。

char 型整数的数据结构

在 char 型整数里面,位 7 为符号位,位 6~0 为数值位 。

二.    数值位

在这一分节,我来讲一下数值位。数值位,是用来表示一个整数的数值大小的。

我们来举一个例子,来说明数值位的含义。

假定有一个数,它是 char 型的,它的符号位为 0,因此它要么是 0,要么是正整数。这个数的二进制形式,为 0B 0011 0110 。

我们把这个数的各个位的情况,画在表格里。

图2

0B 0011 0110 这个二进制数的各个数位,都展示在图 2 里面了。数值位 6~0 展示的是这个数的绝对值。它的绝对值的计算如下所示。

0B 011 0110 = 0 × 2^{6} + 1 × 2^{5} + 1 × 2^{4} + 0 × 2^{3} + 1 × 2^{2} + 1 × 2^{1} + 0 × 2^{0}

                     = 0 × 64 + 1 × 32 + 1 × 16 + 0 × 8 + 1 × 4 + 1 × 2 + 0 × 1

                     = 54

所以呢,原码 0B 0011 0110 的数值位的值是 54,也就是这个原码所表示的数,它的绝对值是十进制数值 54 。它的符号位是 0,表示此数是一个大于或等于 0 的数。综合起来,原码 0B 0011 0110 表示的数,是十进制数 54 。

如果,我们将原码 0B 0011 0110 的符号位改动一下,其余位不变,则结果将变为 0B 1011 0110 。这个原码表示什么数呢?首先呢,它的绝对值依然是十进制数值 54,而符号位为 1,表示此数是一个负数。所以呢,原码 0B 1011 0110 表示的数,是 -54 。

我们来略微总结一下数值位的含义。一个原码中的数值位,表示的是这个数的绝对值。求解绝对值的方法是,首先将除了符号位以外的所有数位,将它们的数值与对应的位权相乘,然后将除了符号位以外的各个数位的【数值 × 位权】的乘积相加,计算结果便是这个原码所代表的数的绝对值。

求出了绝对值以后,再来看它的符号位。如果符号位为 0,表明此数是一个大于或等于 0 的数。如果符号位为 1,表示此数是一个负数。

假定某一个八位二进制数的原码的数值位,经过计算,它所表示的绝对值为十进制数 36。在这个基础上,如果这个原码的符号位为 0,则此源码表示的数为十进制数 +36 。如果这个原码的符号位为 1,则此原码表示的数为十进制数 -36 。

到了这里,我想,关于源码的知识,我应该是大体上讲明白了。

为了巩固以上所学,我再来给出一个例题。

三.    例题

分别求出原码 0B 0110 0111 和 0B 1110 0111 所代表的数。

这俩数,除了最高位不同之外,其余的位都相同。我们将这俩源码的数值位给列在下面的表格里面。

位权2^{6}2^{5}2^{4}2^{3}2^{2}2^{1}2^{0}
位名6543210
数值1100111

我们来计算一下这俩原码的数值位的绝对值。

0B 110 0111 = 1 × 2^{6} + 1 × 2^{5} + 0 × 2^{4} + 0 × 2^{3} + 1 × 2^{2} + 1 × 2^{1} + 1 × 2^{0}

                     = 1 × 64 + 1 × 32 + 0 × 16 + 0 × 8 + 1 × 4 + 1 × 2 + 1 × 1

                     = 103

当符号位为 0 时,则原码表示的数值为 +103,也就是 103 。

当符号位为 1 时,则原码表示的数值为 -103 。

四.     原码 ≠ 源码

源码,也被称作是源代码。它是指程序的代码。可以是 C/C++ 程序的代码,也可以是汇编语言代码,还可以是 Java,C#,HTML,JavaScript 等等的代码。

而原码,它是计算机里面的一种编码方式,是用来表示有符号整数的一种方式。原码,反码,补码,均可以表示有符号整数。而在计算机里面,常用的表示有符号整数的编码方式,为反码。

在我们的教程里,我们是将原码和反码作为理解补码的基础。

结束语

本节知识,到这里就结束了。不知道,大家是否看懂了本节的内容。但愿大家学会了本节的知识点。

专栏导航

本节文章分别属于《Win32 学习笔记》和《MFC 学习笔记》两个专栏,故划分为两个专栏导航。读者可以自行选择前往哪个专栏。

(一)WIn32 专栏导航

上一篇:计算机基础:编码01,无符号数编码

回到目录

下一篇:计算机基础:编码03,根据十进制数,求其原码

(二)MFC 专栏导航

上一篇:计算机基础:编码01,无符号数编码

回到目录

下一篇:计算机基础:编码03,根据十进制数,求其原码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值