Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python z3中的位向量可以表示哪些值?_Python_Z3_Smt_Z3py_Bitvector - Fatal编程技术网

Python 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 =

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