我想我不明白BitVecs在z3中是如何工作的。我写了以下代码:
>>> import z3
>>> s = z3.Solver()
>>> a = z3.BitVec("a", 32)
>>> s.add(z3.ForAll(a, z3.Not(z3.And(a > 2147483647, a < 2147484671))))
我希望这是“不满意”,因为这个范围内外都有值。但是当我运行s.check()
时,我得到:
>>> s.check()
sat
这对我来说很困惑,所以我猜测有溢出。但后来我尝试了:
>>> b = z3.BitVec("b", 32)
>>> s = z3.Solver()
>>> s.add(b == 2147484671)
>>> s.check()
sat
>>> s.model()
[b = 2147484671]
这让我很困惑,因为它表明z3可以使用32位BitVecs来模拟这个数字。另外我跑了:
>>> s = z3.Solver()
>>> c = z3.BitVec("c", 32)
>>> s.add(z3.And(c > 2147483647, c < 2147484671))
>>> s.check()
unsat
让我更加困惑,因为它似乎与第二个例子明显不相容......
答案 0 :(得分:3)
运营商&gt;和&lt;签了。 2147484671在解释为32位数时为负数。这就是你约束不满的原因。 您可以使用UGT / ULT代替&gt; /&lt;忽略符号位。
底线:位向量表示数字,但您需要知道您正在使用的操作的签名是什么。在Python API中,所有运算符重载都是签名操作。