【发布时间】:2022-08-23 01:22:30
【问题描述】:
我对 Python 没有太多经验,所以我需要你的帮助! 在下面的示例中,我可以将 char 转换为无符号整数,但我需要一个有符号整数。如何在 python 中将 char 转换为有符号整数?
d=\"bd\"
d=int(d,16)
print (d)
结果是:189 但我希望:-67
标签: python python-3.x type-conversion signed unsigned-integer
我对 Python 没有太多经验,所以我需要你的帮助! 在下面的示例中,我可以将 char 转换为无符号整数,但我需要一个有符号整数。如何在 python 中将 char 转换为有符号整数?
d=\"bd\"
d=int(d,16)
print (d)
结果是:189 但我希望:-67
标签: python python-3.x type-conversion signed unsigned-integer
首先是挑剔:它不是一个字符,而是一个字符串。
主要问题是int() 不知道输入应该是多长时间;或者换句话说:它不知道哪个位是指定符号的 MSB(最高有效位)。在 python 中,int 仅表示“整数,即任何整数”。与 C 不同,没有定义数字的位大小。
对于int(),输入000000bd 和bd 因此是相同的;并且符号由 - 前缀的存在与否决定。
对于输入数字的任意位数(不仅是标准的 8、16、32,...),您需要手动执行二补码转换步骤,并告诉它假定的输入大小。 (在 C 中,您可以通过将转换结果分配给目标位大小的整数变量来隐式执行此操作)。
def hex_to_signed_number(s, width_in_bits):
n = int(s, 16) & (pow(2, width_in_bits) - 1)
if( n >= pow(2, width_in_bits-1) ):
n -= pow(2, width_in_bits)
return n
该功能的一些测试用例:
In [6]: hex_to_signed_number("bd", 8)
Out[6]: -67
In [7]: hex_to_signed_number("bd", 16)
Out[7]: 189
In [8]: hex_to_signed_number("80bd", 16)
Out[8]: -32579
In [9]: hex_to_signed_number("7fff", 16)
Out[9]: 32767
In [10]: hex_to_signed_number("8000", 16)
Out[10]: -32768
【讨论】:
print(int.from_bytes(bytes.fromhex("bd"), byteorder="big", signed=True))
您可以将字符串转换为字节,然后通过将有符号添加到 True 将字节转换为整数,这将为您提供负整数值。
【讨论】: