dva*_*ria 14 computer-science twos-complement
我正在编写教程,教孩子们(9到13岁)关于编程.我从计算机本身开始,他们没有那么多与计算机科学有关,而是更多地涉及解决计算问题的过程.
有了这个起点,我指导他们理解机器可以帮助我们解决某些计算问题.人们擅长抽象思维和想象力,但计算机在遵循一个明确规定的例程时非常棒.他们可以一次又一次地以惊人的速度做到这一点!
我的教程已经介绍了以二进制格式表示数字.但是你如何代表负数呢?在任何符号系统中,有很多方法可以做到这一点,但为计算机选择的系统有一个非常特殊的原因:减少添加有符号整数值所涉及的机器数量.我们不希望构建和构建单独的芯片只是为了处理负数,我们想要使用我们用于自然数算术的相同芯片!
如果有人在街上问你(这看起来完全不现实)"计算机如何代表负数,为什么他们用这种方式代表他们呢?"
我的具体问题:
计算机如何代表负数?
为什么计算机以这种方式表示负数?
我猜这个经验丰富的开发人员不得不考虑一下这个问题.有些人甚至可能无法得出答案.我不是想要浮夸,这是来自实际经验,我问过专业开发人员这个问题他们无法回答.他们画了一个空白的凝视.给他们JBoss和JavaBeans,他们会让你充满信心.好笑!我也很难解决这个问题,我每次都要提醒自己,我需要一张纸或白板来制定解决方案.我希望能引导学生更好地了解他们正在使用的机器.
sid*_*yll 28
1.计算机如何代表负数?
取正值,反转所有位并加1.
2.为什么计算机会以这种方式表示负数?
它很容易在-7中添加7并且得出零.位操作很快.
它如何变得简单?
以7和-7为例.如果你将7表示为00000111,则查找-7反转所有位并添加一个:
11111000 -> 11111001
Run Code Online (Sandbox Code Playgroud)
现在您可以添加以下标准数学规则:
00000111
+ 11111001
-----------
00000000
Run Code Online (Sandbox Code Playgroud)
对于计算机而言,这种操作相对容易,因为它涉及基本上逐位比较并携带一个.
相反,如果您10000111将-7表示为,则这没有意义:
00000111
+ 10000111
-----------
10001110 (-14)
Run Code Online (Sandbox Code Playgroud)
要添加它们,您将涉及更复杂的规则,例如分析第一位,以及转换值.
并且不要忘记@trashgod所说的,在2的补码中你只有一个零.检查一下:
00000000
11111111(反转所有位)
00000000(加一)
不同于00000000(0)等于10000000(-0)
计算机如何代表负数?
计算机通过计算如果您使用正常的减法规则从零减去该数字将得到的结果来表示负数.也就是说,为了找到-5二进制的内容,你从5(二进制)中减去(0二进制):
0 0 0 0 -
0 1 0 1
----------
(borrow)
-> 1 -> 1 -> 1 ->10 -
0 1 0 1
----------------
1 0 1 1
Run Code Online (Sandbox Code Playgroud)
..所以-5看起来像1011二进制.
为什么计算机以这种方式表示负数?
因为这样做意味着当计算机添加和减去数字时,它不必检查它们中的某些是否为负数:无论如何数学运算正常.这使得计算机更简单,并且更简单的计算机构建起来更便宜.