我需要解决这段代码(C中的代码)
if ( ((0xAAAAAAAAAAAAAAABLL * len_input_serial >> 64) >> 1)+ len_input_serial- 3 * ((0xAAAAAAAAAAAAAAABLL * len_input_serial >> 64) >> 1) != 14)
return 0xFFFFFFFFLL;
这是我的python脚本
from z3 import *
len_input_serial = BitVec("serial_len",64)
solve(LShR(LShR(0xAAAAAAAAAAAAAAABL * len_input_serial,64),1) + len_input_serial - 3 * LShR(LShR(0xAAAAAAAAAAAAAAABL * len_input_serial,64),1) == 14)
然而,这给了我[serial_len = 14]
我知道解决方案应该在[42,38,40]
附近,所以这里有什么问题?
答案 0 :(得分:1)
这个表达式:
sudo port install octave
始终等同于(0xAAAAAAAAAAAAAAABLL * len_input_serial >> 64) >> 1
。如果右移64位数量到64位,则得到0.(请注意,您使用的是0
,它将输入视为无符号数量。)
因此整个事情简化为解决LShr
,这是Z3正在产生的答案。
请注意,当您在Python中写入一个长整数(即0x123L等)时,您将获得无限精度。 (见这里:Maximum value for long integer)。在C中,您获得(最可能的)64位整数。所以,你的Z3代码实际上是正确的;它的Python在这里使用更高的精度,从而引起混乱。