如果我有一个负十进制数,例如-5,并将其转换为十六进制格式。我可以简单地在十六进制数前面加上一个负号吗?或者还有另一种方法可以做到这一点,就像二进制中的 2 的补码一样?
没有“一种方法”来表示负数。 也就是说,有多种表示负数的标准方法。 为了保持数学简单,我假设所有数字都使用 4 位。
0111
为 7,但 1111
为 -7。 (也可以反过来 0111
是 -7 1111
是 7.0111
是 7,但 1000
是 -7(所有位都翻转。这具有奇数属性:0000
是自然 0,但 1111
是(负零)-0。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)
这样的系统很难进行数学计算,但它是一个示例,您不必局限于特定的做任何事情的方式。 只要您构建例程以根据预期输入生成预期输出,您就可以使位到值的映射具有您想要的含义。
意义是你强加给比特的东西这一想法很重要。 当您开始处理文本时,“编码”是强加在存储文本的位上的含义,相同的位有时会以不同的编码方案编码不同的字母。
将负数转换为十六进制的步骤:
了解位宽:
决定位宽(例如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。