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术语)当结果小于给定操作数编码位数所能表示的最小整数时。这是可以的,但在我所看到的文献中并不常见(例如),因为这个概念只适用于浮点数

在《英特尔编程手册》中,溢出/下溢处理进位和溢出标志:

进位标志-在算术运算生成进位或进位标志时设置 从结果的最高有效位中借用;变明朗 否则。此标志指示的溢出情况 无符号整数算术。它还用于多精度测量 算术

溢出标志-如果整数结果太大,则设置为正 数字或太小的负数(不包括符号位)不适合 在目标操作数中;否则的话。此标志表示一个错误 有符号整数(2的补码)算法的溢出条件

请确认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;
}