我正在调试一个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 - 1
。18446744073709551610
适用于无符号输入,但您需要0xfffffffffffffffa
是2的补码表示的有符号数。它实际上是
>>> 0xfffffffffffffffa - 2 ** 64
-6
因为负数通过反复加或减一个比最大值大的值来转换为无符号,直到值在范围内——我们现在反转运算,得到-6
。
请注意,使用%ld
扫描到对象中,然后使用%lx
打印其值是不正确的,除非变量是有符号的int
,并且printf
调用将参数强制转换为unsigned
,因为%lx
需要unsigned long
int!如果编译器没有对此发出警告,请添加-Wall
等开关以启用额外的诊断。