假设a
是值为254
的8位整数。如果a
是有符号整数,则实际上将其视为-2
。相反,如果a
未签名,则仍为254
。
我试图用Z3的BitVector理论模拟这个有符号/无符号整数问题,但似乎BitVector不允许这样做。这是真的?那么有关如何在Z3py中对此进行建模的任何想法吗?
非常感谢。
答案 0 :(得分:8)
Z3具有用于签名和未签名解释的API。
例如,在C API中,Z3_mk_bvslt
创建的是带符号的小于,Z3_mk_bvult
是无符号的。在Z3Py中,我们使用已签名的文件重载<
,<=
,...。要创建未签名的a < b
,我们必须使用ULT(a,b)
。以下是未签名的运算符列表:ULE
(<=
),ULT
(<
),UGE
(>=
),{{1 (UGT
),>
(无符号除法),UDiv
(无符号余数)。您可以在此处找到更多信息:
http://research.microsoft.com/en-us/um/redmond/projects/z3/namespacez3py.html
答案 1 :(得分:5)
您可以正确地观察到位向量值不带符号。 另一方面,存在位向量操作和关系的签名版本。 因此,您可以将相同的位向量实体视为有符号或无符号数,方法是将它们传递给有符号或无符号比较(无符号/无符号)或有符号或无符号运算(有符号除法/无符号除法)。其他算术运算对有符号和无符号实体的工作方式相同。例如,无论您是想将它们解释为有符号还是无符号,添加都会以相同的方式移动这些位。
Z3遵循SMT-LIB2理论的惯例,您可以在http://smtlib.cs.uiowa.edu/theories/FixedSizeBitVectors.smt2
上找到关于这些理论的大量文档。