我正在编写教程,教孩子们(9到13岁)关于编程 . 我从计算机本身开始,他们与计算机科学没什么关系,更多的是涉及解决计算问题的过程 .
有了这个起点,我指导他们理解机器可以帮助我们解决某些计算问题 . 人们擅长抽象思维和想象力,但计算机在遵循一个明确的例行程序时非常棒 . 他们可以一次又一次地以惊人的速度做到这一点!
在我的教程中已经介绍了以二进制格式表示数字 . 但是你如何代表负数呢?在任何符号系统中,有很多方法可以做到这一点,但为计算机选择的系统有一个非常特殊的原因:减少添加有符号整数值所涉及的机器数量 . 我们不希望构建和构建单独的芯片只是为了处理负数,我们想要使用我们用于自然数算术的相同芯片!
如果有人在街上问你(这看起来完全不现实)“计算机如何代表负数,为什么他们用这种方式代表他们呢?”
我的具体问题:
计算机如何表示负数?为什么计算机会以这种方式表示负数?
我猜这个经验丰富的开发人员不得不考虑一下这个问题 . 有些人甚至可能无法得出答案 . 我不是想要浮夸,这是来自实际经验,我问过专业开发人员这个问题他们无法回答 . 他们画了一个空白的凝视 . 给他们JBoss和JavaBeans,他们会让你充满自信 . 好笑!我也很难解决这个问题,我每次都要提醒自己,我需要一张纸或白板来制定解决方案 . 我希望能引导学生更好地了解他们正在使用的机器 .
6 回答
取正值,反转所有位并加1 .
它很容易在-7中添加7并且得出零 . 位操作很快 .
How does it make it easy?
以7和-7为例 . 如果将7表示为
00000111
,则查找-7将所有位反转并添加一个:现在您可以添加以下标准数学规则:
对于计算机而言,这种操作相对容易,因为它涉及基本上逐位比较并携带一个 .
如果您将-7表示为
10000111
,那么这将没有意义:要添加它们,您将涉及更复杂的规则,例如分析第一位,以及转换值 .
并且不要忘记@trashgod所说的,在2的补码中你只有一个零 . 检查一下:
不同于
00000000
(0)等于10000000
(-0)记下一个数字行
-32768 ... -1,0,1,2,...... 32767
添加移动到右侧 . 减法移动到左侧 . 在概念上很好,但我们怎么能代表这个标志呢?
我们可以使用“有符号量”,其中符号和值是分开的 . 这让人感到困惑,因为我们有两条带有不同符号的平行数字线 .
“有符号幅度”的替代方案是将每个数字编码为另一个数字 .
我们可以为所有数字添加32768的偏移量 . 新范围是无符号0到65535.一切仍然有效,对吧?您只需将固定偏差值应用于所有数字 . 添加移动到右侧 . 减法移动到左侧 . 32768可以被解码为0. 0可以被解码为-32768 .
这非常有效 . “编码”数字只是添加偏见 . “解码”一个数字只是减去了偏见 .
这是另一种编码方案 .
将所有负数转移到数字行的另一侧 .
0,1,2,...,32767,-32768,... -1
增加仍然向右移动 . 取任何数字(有一个例外) . 它右边的数字总是更大 .
一个例外是32767.右边的数字是“溢出” .
减法仍然向左移动 . 取任何数字(有一个例外) . 左边的数字总是较小 . 唯一的例外是-32768 . 左边的数字是“下溢” .
编码和解码涉及更多一些 . 0到32767有一个简单的编码和解码:什么都不做 . 这些数字被编码为自己 . 但是,32768到65535是负数的编码 .
Q1 . 计算机如何代表负数?
2's compliment method!
Q2 . 为什么计算机会以这种方式表示负数?
以下是2的赞美作品:
对于任何x,
正如您所看到的,2 's compliment is logical and easy to implement and doesn' t具有极端情况,这就是为什么它比其他方法更受欢迎 .
让我们考虑1's compliment,一个我正在谈论的极端情况的方法,其中0和-0存在(所有位未设置= 0,所有位设置= -0)转换为为硬件电路执行的更多操作,尤其是在使用数字x和-0的操作期间 . [维基百科在Avoiding Negative Zero上有很好的例子,你可以看看它们]
我希望这个解释可以抚慰你孩子的思想......
我能想到的两个重要原因:
基本算术运算的简单性 . 您不必担心检查符号位以决定是添加还是减去 .
代表性的唯一性 . 它是's nice to not have to worry about negative zero since there is no way to represent negative zero in two'的补充 .
From Wikipedia:
How do computers represent negative numbers?
计算机通过计算如果您使用正常的减法规则从零减去该数字将得到的结果来表示负数 . 也就是说,要找到
-5
在二进制中的样子,你从0
(二进制)中减去5
(二进制):..so
-5
在二进制文件中看起来像1011
.Why do computers represent negative numbers this way?
因为这样做意味着当计算机添加和减去数字时,它不必检查它们中的一些是否为负数:无论如何数学运算正常 . 这使得计算机更简单,并且更简单的计算机构建起来更便宜 .
两个恭维用于简化加法和减法到一个操作,这可以由一个硬件单元执行 . 而不是从另一个中减去一个数字,在两个恭维算术中,你将一个数字与另一个数字相反 . 回到过去,有一个单独的硬件用于减去数字将是一个非常大的问题,所以想出一个系统来执行减法和单个单位的添加是非常有用的 .
您可以通过翻转位并添加一个来找到两个恭维中任意数字的倒数 . 例如,
-1
将在四位实现中表示如下:您可以通过添加以下两项来验证这一点:
但是,我们正在使用四位,因此结果会被截断 . 我们现在有
0000
,或0
. 我们添加了一个数字,它的负数和零 . 欢呼!现在,作为最后一个例子,让我们做4 - 6. 4表示为
0100
. 6表示为0110
. 要获得-6,翻转位并添加一个:1001 + 1 = 1010
.0100 + 1010 = 1110
.1110
是一个负数(所有带有1
在最高位数的数字在两个赞美中都是负数) . 为了找出它的绝对值,我们翻转这些位并添加1.0001 + 1 = 0010
或2.因此,我们添加的结果是-2
.4 - 6 -2
. 我们的数学检查 .恭喜 . 你现在和计算机一样聪明 .