c-Python十六进制到有符号整数的转换



我正在调试一个C程序,该程序使用%ld作为格式通过scanf()接受输入。

我需要发送一个输入,使其等于0xfffffffffffffffa

如果我使用Python将上面的十六进制值转换为十进制,我会得到:18446744073709551610,如下所示:

>>> a = 0xfffffffffffffffa
>>> a
18446744073709551610L

然而,当我调试程序时,我可以看到程序读取的值为:0x7ffffffffff

那么,有没有一种方法可以生成一个十进制,使scanf()将其读取为0xffffffffff而不是0x7ffffff?

scanf有两个转换说明符用于读取十进制数。u将一个无符号十进制整数-读入一个无符号整数类型的变量,d将一个有符号十进制整数[/em>读入一个有符号整数类型的变量。当读取有符号十进制整数时,64位2的补码数的最大值为2 ** 63 - 1,即9223372036854775807。当匹配到超过此值的数字时,scanf仍将与之匹配,但将相应的参数设置为最大值。

对于无符号64位,最大值为2 ** 64 - 118446744073709551610适用于无符号输入,但您需要0xfffffffffffffffa是2的补码表示的有符号数。它实际上是

>>> 0xfffffffffffffffa - 2 ** 64
-6

因为负数通过反复加或减一个比最大值大的值来转换为无符号,直到值在范围内——我们现在反转运算,得到-6


请注意,使用%ld扫描到对象中,然后使用%lx打印其值是不正确的,除非变量是有符号的int,并且printf调用将参数强制转换为unsigned,因为%lx需要unsigned longint!如果编译器没有对此发出警告,请添加-Wall等开关以启用额外的诊断。

最新更新