📜  将十进制转换为十六进制十进制,包括负数(1)

📅  最后修改于: 2023-12-03 14:53:48.326000             🧑  作者: Mango

将十进制转换为十六进制

在计算机系统中,我们经常需要对数字进行各种进制之间的转换,其中包括把十进制转换为十六进制。在本文中,我们将为您介绍如何将十进制数转换为十六进制数,包括负数。

十进制转十六进制公式

我们首先需要了解十进制转换为十六进制的公式:

将十进制数不断除以16,直到商为0为止,然后将每步的余数倒序排列即为十六进制数。

正数转换

以数字87为例,将其转换为十六进制数。

我们首先将87除以16,得到商为5,余数为7。接着将商5除以16,得到商为0,余数为5。因为商为0,所以转换结束。

将每步的余数倒序排列,得到十六进制数为57。

def decimal_to_hex(num):
    if num == 0:
        return "0"
    hex_table = {10: "A", 11: "B", 12: "C", 13: "D", 14: "E", 15: "F"}
    result = ""
    while num > 0:
        remainder = num % 16
        if remainder >= 10:
            result += hex_table[remainder]
        else:
            result += str(remainder)
        num //= 16
    return result[::-1]

print(decimal_to_hex(87)) # 输出:57
负数转换

要将负数转换为十六进制数,首先需要将其转换为补码。

以数字-87为例,将其转换为十六进制数。

我们首先将-87转换为8位二进制数,即为10010111。

接着将这个二进制数求它的补码。步骤如下:

  1. 取反:11101000
  2. 加1:11101001

因此,-87的补码为11101001。

将补码转换为十六进制数的步骤与正数的转换相同。即将补码不断除以16,直到商为0为止,然后将每步的余数倒序排列即为十六进制数。

因为补码为11101001,将其转换为十六进制数得到数值为E9。因为我们原来输入的是负数,因此最终结果为-0xE9。

def decimal_to_hex(num):
    if num == 0:
        return "0"
    hex_table = {10: "A", 11: "B", 12: "C", 13: "D", 14: "E", 15: "F"}
    result = ""
    if num < 0:
        num = 2 ** 32 + num # 将负数转换为补码
    while num > 0:
        remainder = num % 16
        if remainder >= 10:
            result += hex_table[remainder]
        else:
            result += str(remainder)
        num //= 16
    return "-0x" + result[::-1] if num < 0 else "0x" + result[::-1]

print(decimal_to_hex(87)) # 输出:0x57
print(decimal_to_hex(-87)) # 输出:-0xE9
结论

我们已经着重介绍了如何将十进制转换为十六进制,包括正数和负数的情况。需要注意的是,负数转换为十六进制数的结果前面一定要添加负号。在Python中,负数是以补码的形式存储的,因此我们需要先将负数转换为补码,再把补码转换为十六进制数。