如何表示负的十六进制数?

问题描述 投票:0回答:2

如果我有一个负十进制数,例如-5,并将其转换为十六进制格式。我可以简单地在十六进制数前面加上一个负号吗?或者还有另一种方法可以做到这一点,就像二进制中的 2 的补码一样?

hex decimal
2个回答
9
投票

没有“一种方法”来表示负数。 也就是说,有多种表示负数的标准方法。 为了保持数学简单,我假设所有数字都使用 4 位。

  1. 使用符号位(二进制)
    0111
    为 7,但
    1111
    为 -7。 (也可以反过来
    0111
    是 -7
    1111
    是 7.
  2. 使用 1 的补码。
    0111
    是 7,但
    1000
    是 -7(所有位都翻转。这具有奇数属性:
    0000
    是自然 0,但
    1111
    是(负零)-0。
  3. 使用2的补码。 负数是 1 的补码加一,因此
    0111
    是 7,但
    1000 + 0001
    1001
    是 -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)

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

意义是你强加给比特的东西这一想法很重要。 当您开始处理文本时,“编码”是强加在存储文本的位上的含义,相同的位有时会以不同的编码方案编码不同的字母。


0
投票

将负数转换为十六进制的步骤:

了解位宽:

决定位宽(例如8位、16位、32位等)。 这决定了使用多少位来存储二进制数并影响最终的十六进制结果。

将正数转换为二进制: 取负数的绝对值并将其转换为二进制。 例如,如果数字为-10,则绝对值为10,其二进制表示为1010(4位)。

填充二进制数: 用前导零填充二进制数以匹配所选的位宽度。 例如,1010 在 8 位表示中变为 00001010。

反转位(补码): 翻转所有位(0 变为 1,1 变为 0)。 对于 00001010,其补码是 11110101。

倒置二进制数加 1(补码): 将二进制数的补码加 1 即可得到二进制补码。 对于 11110101,加 1 得到 11110110。

将二进制数字分组为半字节: 将二进制数从右侧开始分成 4 位(半字节)组。 对于 11110110,组是 1111 和 0110。

将每个半字节转换为十六进制: 将每组 4 位转换为其等效的十六进制。 对于 1111,十六进制为 F,对于 0110,十六进制为 6。

组合十六进制数字: 连接十六进制数字即可得到最终结果。 对于 11110110,十六进制结果是 F6。

以下是一个例子:

将-10转换为8位十六进制:

位宽:8位。

正二进制: ∣10∣=10 → 1010。

填充至 8 位: 00001010.

反转位: 11110101.

加 1: 11110101 + 1 = 11110110。

分组为半字节: 1111 和 0110。

转换为十六进制: 1111 = F,0110 = 6。

最终十六进制: F6。

© www.soinside.com 2019 - 2024. All rights reserved.