如何表示负十六进制数?

4

如果我有一个负的十进制数,比如说-5,并将其转换为十六进制格式。我能否简单地在十六进制数前面加上负号?或者像使用二进制的补码那样进行另一种处理方式?


通常我们使用十六进制格式来表示数字,因此不会加负号。正如您所建议的那样,您将根据表示设置十六进制值。 - Philip Brack
十进制转十六进制转换器 http://www.rapidtables.com/convert/number/decimal-to-hex.htm - Berdesdan
1个回答

9
表示负数的方式并没有一种“标准”的方法,但是有许多常用的表示负数的方式。为了简化数学运算,我们假设所有数字都使用4位二进制数。以下是三种表示负数的方式:
1. 使用符号位。例如,0111代表7,而1111代表-7(或者反过来,0111代表-7,1111代表7)。
2. 使用1的补码。例如,0111代表7,而1000代表-7(所有位取反)。这种方式有一个奇怪的特性,即0000表示自然数0,而1111表示负零(-0)。
3. 使用2的补码。取反操作是先进行1的补码,然后加1。例如,0111代表7,而1000 + 00011001代表-7。这种方式利用整数溢出来避免负零的存在。例如,0000的相反数是1111 + 0001,结果溢出为0000。此外,它还有一个好处,即将某个数与其相反数相加可以得到0,前提是这两个数都能够被表示出来(负数比正数多一个)。例如,7 + (-7)等于0111 + 1001,结果溢出为00000
你可能会听到“位数意味着任何你想要的东西”的说法。这意味着你可以想出任何数量的方式来表示任何东西,只需将位映射到所需的值即可。例如,以下是一种奇怪而古怪的表示质数的方式。
(bits) => value
0001 => 2
0010 => 3
0011 => 5
0100 => 7
0101 => 11
0110 => 13
0111 => 17
(and so on)

这样的系统难以进行数学计算,但它是一个例子,说明您不必局限于特定的操作方式。只要建立例行程序以从预期的输入产生预期的输出,您可以使位与值之间的映射意味着任何您想让它意味的东西。
这种将含义强加于位上的思想很重要。当您开始处理文本时,“编码”就是强加在存储文本的位上的含义,同样的位有时在不同的编码方案中编码不同的字母。

你没有回答问题,问题是关于十六进制的。你给出了一个二进制的解决方案。当然有方法可以处理十六进制中的负数,但你却说它是任意的。提问者想要知道其他人是如何处理负数的具体示例。出于这个原因,我给你点了个踩。 - George Xavier
@GeorgeXavier,“解决方法”正是英特尔CPU的设计方式。几乎所有在过去15年中制造的CPU都是如此,所以我无法想象你对这个主题了解多少。相比其他选择,2的补码更受青睐,因为你只得到一个(正)零。 - Edwin Buck
他不问计算机如何做到这一点。他理论上询问如何表示它。他特别指的是十六进制,正如我之前提到的。 - George Xavier
十六进制只是位的不同表示方式。1010 = A并不意味着计算机在任何地方存储了一个“ A”,它存储了四个位,“1010”。因此,要“用十六进制表示负数”,通常必须决定将使用哪种二进制编码,然后将该编码转录为十六进制。在我的例子中,以符号位表示法编码的-4将是十六进制'C',而以1的补码编码的-4将是1011,或十六进制'B',最后以2的补码编码的-4将是1100或十六进制'C'。请注意,这两种编码中有两个是“C”只是巧合。 - Edwin Buck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接