gpt4 book ai didi

math - 二进制补码——如何处理负数?

转载 作者:行者123 更新时间:2023-12-04 04:34:11 24 4
gpt4 key购买 nike

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

除了所有这些之外,我还了解到当一个“负”数被添加到另一个(任何符号)数字时设置的零标志或结转标志。由于二进制补码的工作方式,0x01 + 0xff = 0x00(前导 1 被截断),每当添加该标志时都会设置此标志。这个标志究竟是做什么用的?

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

编辑
完成了问题,所以感觉自由火了。

最佳答案

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

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

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

您读到的零标志和进位标志是在计算机处理器中执行比较指令时设置的标志。大多数高级语言不允许您直接访问这些标志。许多处理器都有这样一种形式的指令:

cmp a, b

该指令从 a 中减去 b 并丢弃差值,但记住了几个描述减法的标志:结果为零(零标志)吗?是否发生借用(借用标志)?结果是否定的(符号标志)?是否发生溢出(溢出标志)?

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

通常不需要“取消否定”一个数字来执行算术运算。处理器包括处理二进制补码的算术指令。通常加法和减法指令是类型不可知的,与比较指令的方式相同,但乘法和除法指令不是(除了一些返回部分结果的乘法形式)。加法和减法指令可以是类型不可知的,因为算术中出现的换行对二进制补码和无符号都有效。但是,这种包装不适用于乘法和除法。

关于math - 二进制补码——如何处理负数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20035409/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com