在z3中用BitVecs表示什么值?

时间:2017-07-12 19:28:15

标签: python z3 smt z3py bitvector

我想我不明白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

让我更加困惑,因为它似乎与第二个例子明显不相容......

1 个答案:

答案 0 :(得分:3)

运营商&gt;和&lt;签了。 2147484671在解释为32位数时为负数。这就是你约束不满的原因。 您可以使用UGT / ULT代替&gt; /&lt;忽略符号位。

底线:位向量表示数字,但您需要知道您正在使用的操作的签名是什么。在Python API中,所有运算符重载都是签名操作。