首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >进位标志和减法问题

进位标志和减法问题
EN

Stack Overflow用户
提问于 2010-05-18 01:50:49
回答 5查看 7.4K关注 0票数 3

如果从一个较小的数字中减去一个较大的数字,则需要借用。进位标志在减法操作期间起借位的作用。现在假设我们要从56中减去66,显然需要借位,并将设置进位标志。现在如何执行减法来获得结果-10,计算机如何区分结果将是负数。请解释一下流程。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-05-18 02:16:54

通常,减法被实现为否定,然后是加法。因此,对于您的示例,CPU将在内部使用56和加法66。在x86 (或大多数其他现代处理器)上,求反将使用2的补码,这意味着求反转换为“对所有位进行补码,然后加1(并忽略任何进位)”。

代码语言:javascript
复制
    0011 1000
-   0100 0010
    ---------

第二个操作数的转换如下:

代码语言:javascript
复制
complement bits: 1011 1101
Increment:       1011 1110

所以执行的操作是:

代码语言:javascript
复制
    0011 1000
+   1011 1110
--------------
=   1111 0110

可以将此结果视为246 (作为无符号数字)或-10 (作为有符号数字)。

票数 5
EN

Stack Overflow用户

发布于 2010-05-18 02:01:32

如果计算机使用的是2的补码,则不需要这样做。

让我们考虑一个更简单的例子,3- 5:

代码语言:javascript
复制
    0011 = 3
-   0101 = 5
————————
    1110 = 14

结果是14,但在2的补码中,这也是-2的值。因此,如果代码使用带符号的类型,它将正确地得到-2。否则,它将得到14。这完全取决于程序员如何编写代码。

票数 3
EN

Stack Overflow用户

发布于 2010-05-18 02:06:31

计算机不做减法运算。它做了一个负数的加法。

因此,56 -66 = 56 +(- 66 )

56 = 0x38 (十六进制38 )

-66 = 0xFFFFFFBE (32位系统中0x42的补码)

如果你将这些十六进制数字相加,你将得到0xFFFFFF6,这是一个十进制10的0xA的负数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2851412

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档