Z3术语中的下溢定义是什么
玩Z3术语中的下溢定义是什么,z3,Z3,玩Z3_mk_bvadd_no_underflow()和Z3_mk_bvadd_no_overflow()我感觉underflow的定义与我在其他文献中找到的不匹配(维基百科、英特尔编程手册、stackoverflow等): 我知道溢出是指加法的结果大于给定操作数编码位数所能表示的最大数。这是正常的 对于下溢,我理解为(用Z3术语)当结果小于给定操作数编码位数所能表示的最小整数时。这是可以的,但在我所看到的文献中并不常见(例如),因为这个概念只适用于浮点数 在《英特尔编程手册》中,溢出/下溢
Z3_mk_bvadd_no_underflow()
和Z3_mk_bvadd_no_overflow()
我感觉underflow的定义与我在其他文献中找到的不匹配(维基百科、英特尔编程手册、stackoverflow等):
- 我知道溢出是指加法的结果大于给定操作数编码位数所能表示的最大数。这是正常的
- 对于下溢,我理解为(用Z3术语)当结果小于给定操作数编码位数所能表示的最小整数时。这是可以的,但在我所看到的文献中并不常见(例如),因为这个概念只适用于浮点数
我建议将其添加到文档中,以及假定的减法方法(从第二个操作数减去第一个操作数,与从第一个操作数减去第二个操作数),它适用于Z3的许多其他API。下溢谓词的最佳定义是代码本身,请参见示例;以下哪项(减去参考计数): 请注意,下溢谓词假定参数是有符号位向量,除了
Z3_mk_bvsub_no_underflow
具有启用无符号语义的标志
对于最后的注释:(c,t1,t2)总是计算t1-t2
Z3_ast Z3_API Z3_mk_bvadd_no_underflow(Z3_context c, Z3_ast t1, Z3_ast t2) {
Z3_ast zero = Z3_mk_int(c, 0, Z3_get_sort(c, t1));
Z3_ast r = Z3_mk_bvadd(c, t1, t2);
Z3_ast l1 = Z3_mk_bvslt(c, t1, zero);
Z3_ast l2 = Z3_mk_bvslt(c, t2, zero);
Z3_ast args[2] = { l1, l2 };
Z3_ast args_neg = Z3_mk_and(c, 2, args);
Z3_ast lt = Z3_mk_bvslt(c, r, zero);
Z3_ast result = Z3_mk_implies(c, args_neg, lt);
return result;
}