我正在调试一个C程序,该程序使用%ld作为格式通过scanf()接受输入。
我需要发送一个等于0xfffffffffffffffa
的输入。
如果我使用Python将上述十六进制值转换为十进制,则会得到:18446744073709551610,如下所示:
>>> a = 0xfffffffffffffffa
>>> a
18446744073709551610L
但是,当我调试程序时,我可以看到程序读取的值为:0x7fffffffffffffff
那么,有没有一种方法可以生成一个十进制数,以使scanf()将其读取为0xfffffffffffffffffa而不是0x7fffffffffffffffff?
答案 0 :(得分:0)
scanf
有 2 个转换说明符,用于读取十进制数字。 u
将无符号十进制整数读取到无符号整数类型的变量中,d
读取有符号十进制整数 >(转换为带符号整数类型的变量)。读取带符号的十进制整数时,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
整数!如果您的编译器未发出警告,请添加诸如-Wall
之类的开关以启用额外的诊断。