【问题标题】:How to represent a negative hexadecimal number?如何表示一个负的十六进制数?
【发布时间】:2018-04-23 03:54:25
【问题描述】:

如果我有一个负十进制数,例如 -5,并将其转换为十六进制格式。我可以简单地在十六进制数字前面加上一个负号吗?还是有另一种方法,比如二进制中的 2 的恭维?

【问题讨论】:

标签: hex decimal


【解决方案1】:

没有“一种方式”来表示负数。也就是说,有许多标准方法可以表示负数。为了简单起见,我假设所有数字都使用 4 位。

  1. 使用符号位(二进制)0111 是 7,但 1111 是 -7。 (也可以反过来做 0111 is -7 1111 is 7.
  2. 使用 1 的补码。 0111 是 7,但 1000 是 -7(所有位翻转。这具有 0000 是自然 0,但 1111 是(负零)-0 的奇数属性。
  3. 使用 2 的补码。否定是 1 的补码加一,所以 0111 是 7,但 1000 + 00011001 是 -7。这利用整数溢出来保持没有负零。 0000 否定是 1111 + 0001 溢出到 0000。它还具有一些不错的属性,例如,如果两个数字都可以写入(负数比正数多一个),则将某个数字加上它的负数解析为零。 7 + (-7) 是 0111 + 1001 溢出到 0 0000

您可能会听到这样的说法:“位表示您希望它们表示的任何含义”。这意味着您可以想出任意数量的方法来表示任何东西,您只需将位“映射”到您想要的值。例如,这是一种奇怪而异想天开的素数表示方式。

(bits) => value
0001 => 2
0010 => 3
0011 => 5
0100 => 7
0101 => 11
0110 => 13
0111 => 17
(and so on)

这样的系统很难进行数学运算,但它是一个示例,您不必受限于做任何事情的特定方式。只要您构建例程以从预期输入产生预期输出,您就可以使位到值的映射意味着您想要的任何含义。

这种将意义强加于位的想法很重要。当你开始处理文本时,“编码”是强加于存储文本的位的含义,相同的位有时会在不同的编码方案中编码不同的字母。

【讨论】:

  • 您没有回答问题。这是关于十六进制的。您使用二进制给出了解决方法。当然有一些方法可以处理十六进制的负数,你可以说它是你想要的任何东西。该行动正在寻找其他人如何做到这一点的具体例子。出于这个原因,我投了反对票。
  • @GeorgeXavier 这个“解决方法”正是英特尔 CPU 的设计目的。就像过去 15 年制造的几乎所有 CPU 一样,所以我无法想象您对这个主题了解多少。 2 的补码优于其他选择,因为您只能得到一个(正)零。
  • 他没有问计算机是如何做到的。他在理论上询问人们如何记下它。正如我之前提到的,他特别指的是十六进制。
猜你喜欢
  • 2021-07-12
  • 2011-10-02
  • 2021-08-13
  • 2013-10-30
  • 1970-01-01
  • 1970-01-01
  • 2013-10-20
  • 1970-01-01
  • 2016-02-06
相关资源
最近更新 更多