Python z3中的位向量可以表示哪些值?
我想我不明白BitVec在z3中是如何工作的。我编写了以下代码:Python z3中的位向量可以表示哪些值?,python,z3,smt,z3py,bitvector,Python,Z3,Smt,Z3py,Bitvector,我想我不明白BitVec在z3中是如何工作的。我编写了以下代码: >>> import z3 >>> s = z3.Solver() >>> a = z3.BitVec("a", 32) >>> s.add(z3.ForAll(a, z3.Not(z3.And(a > 2147483647, a < 2147484671)))) 这让我很困惑,所以我猜其中有溢出。但后来我试着: >>> b =
>>> import z3
>>> s = z3.Solver()
>>> a = z3.BitVec("a", 32)
>>> s.add(z3.ForAll(a, z3.Not(z3.And(a > 2147483647, a < 2147484671))))
这让我很困惑,所以我猜其中有溢出。但后来我试着:
>>> b = z3.BitVec("b", 32)
>>> s = z3.Solver()
>>> s.add(b == 2147484671)
>>> s.check()
sat
>>> s.model()
[b = 2147484671]
这让我很困惑,因为它表明z3可以使用32位位位向量来模拟这个数字。此外,我还跑:
>>> s = z3.Solver()
>>> c = z3.BitVec("c", 32)
>>> s.add(z3.And(c > 2147483647, c < 2147484671))
>>> s.check()
unsat
>s=z3.Solver()
>>>c=z3.BitVec(“c”,32)
>>>s.add(z3.和(c>2147483647,c<2147484671))
>>>美国支票
未售出
这让我更加困惑,因为它显然与第二个示例不兼容…运算符>和<被签名。 2147484671在解释为32位数字时为负数。这就是为什么您的约束未满足。 可以使用UGT/ULT而不是>/<忽略符号位
一句话:位向量表示数字,但您需要知道所使用的操作的符号是什么。在Python API中,所有运算符重载都是有符号的操作。运算符>和<都是有符号的。 2147484671在解释为32位数字时为负数。这就是为什么您的约束未满足。 可以使用UGT/ULT而不是>/<忽略符号位 一句话:位向量表示数字,但您需要知道所使用的操作的符号是什么。在Python API中,所有运算符重载都是有符号操作
>>> s = z3.Solver()
>>> c = z3.BitVec("c", 32)
>>> s.add(z3.And(c > 2147483647, c < 2147484671))
>>> s.check()
unsat