当前位置: 首页 > 知识库问答 >
问题:

二的补数--负数是如何处理的?

郑燕七
2023-03-14

我的理解是,数字是用两者的恭维来否定的,我的理解是:!num+1。所以我的问题是,这是否意味着,对于变量'foo'=1,否定的'foo'将与变量'bar'=255完全相同。如果我们检查-'foo'=='bar'或-'foo'==255,我们会得到它们相等吗?我知道有些语言,如Java,保留一个符号位--所以比较会产生假。没有的语言呢?我假设汇编程序/本机没有符号位。

我的最后一个问题是,对于其他的数学运算(比如乘法),我是否必须对这个数字重新求反(所以它现在是正数),执行运算,然后对结果求反?例如,!((!neg+1)*pos)+1。

编辑完成了这个问题,所以放心开火吧。

共有1个答案

蒋鸿文
2023-03-14

是的,在two的补码中,数x表示为~x+1,其中~x是x在某些固定数位中的二进制数的按位补码。例如,对于八个位,x的二进制数字是000000001,所以按位补码是11111110,加一产生11111111。

没有办法区分八位二补中的-1和八位二进制中的255(没有符号)。它们都有相同的位表示:11111111。如果你同时使用这两个数字,你必须分别记住哪一个是八位二的补码,哪一个是普通的八位二进制,或者你必须使用八位以上的数字。换句话说,在原始位级别,11111111只是8位;在我们决定如何解释它之前,它是没有价值的。

Java和典型的其他语言不维护与数字值分开的符号位;符号是数字编码的一部分。另外,典型的语言不允许您比较不同的类型。如果你有一个二的补码x和一个无符号y,那么其中一个必须在比较之前转换成另一个的类型,或者它们都必须转换成第三种类型。因此,如果您比较x和y,其中一个转换为另一个,那么转换将溢出或换行,您不能期望得到正确的数学结果。为了比较这两个数字,我们可以将它们每个转换为一个更宽的整数,比如32位,然后进行比较。将八位二进制补码11111111转换为32位整数生成-1,将八位普通二进制补码11111111转换为32位整数生成255,然后比较报告它们不相等。

cmp a, b

compare指令要求被比较的两个事物是相同的类型(两个的补码或无符号),但它并不关心是哪种类型。以后可以根据类型检查标志的特定组合来测试结果。也就是说,标志中记录的信息可以区分一个二的补码数是否大于另一个,或者一个无符号数是否大于另一个,这取决于所做的测试。有测试所需标志属性的条件分支指令。

通常不需要对一个数进行“反求”来执行算术运算。处理器包括对两个的补数工作的算术指令。通常,加法和减法指令是与类型无关的,与比较指令相同,但乘法和除法指令不是(除了某些形式的乘法返回部分结果)。加法和减法指令可以是类型无关的,因为在算术中发生的换行同时适用于两个的补码和无符号。然而,这种包装对乘法和除法不起作用。

 类似资料:
  • 问题内容: 我想使用二进制补码表示一位负整数。使用标准的Python位表示实用程序并没有多大帮助: 的补码形式为。我该怎么做呢? 问题答案: Python的整数已经使用二进制补码,但是由于它们具有任意精度,因此负数的二进制表示形式在开始时将具有一个无限的1s字符串,就像正数具有一个无限的0s字符串一样。由于显然无法显示,因此用负号代替。 如果您想要特定宽度的二进制表示形式,则可以使用模数。

  • 我想做一些长整数数学(128位)与英特尔I64汇编和需要创建一个2的补充。假设我的正值在RDX:RAX中。 2的补码是通过“翻转位并加1”来完成的。所以最简单的实现是(4条指令和14字节的代码): 还是4个指令。但是我可以减去-1,而不是加+1,因为SBB将进位加到了减数,所以当进位是清晰的时,我会加+1。所以我下一个最好的尝试是,用3条指令和10字节的代码: 正如你可以从我冗长的文本中看到的,这

  • 本文向大家介绍请说一下,你曾经处理过的最大量级数据是多少?处理目的是?你是如何处理的?处理结果如何?相关面试题,主要包含被问及请说一下,你曾经处理过的最大量级数据是多少?处理目的是?你是如何处理的?处理结果如何?时的应答技巧和注意事项,需要的朋友参考一下

  • 我试图找到一种快速/简单的方法,将二元补码字符串转换为负十进制数。我曾尝试使用这个问题中提出的方法,但它不起作用。这是我正在尝试运行的代码: 当我运行此代码时,结果是9。我错过了什么吗?我做错了什么?

  • 我在C中遇到了一些关于整数除法的奇怪结果。我正在尝试计算:-2147483648/-1。 我得到的是3种不同情况下的3种不同结果: 为什么整数除法运算在不同的情况下产生不同的结果?

  • 假设我有小数21-10=10。 我似乎不明白这里发生了什么,为什么我会得到这些情况的正确答案。 任何澄清都有帮助!