Играя с Z3_mk_bvadd_no_underflow()
и Z3_mk_bvadd_no_overflow()
у меня было ощущение, что определение сгущенного продукта не соответствует тому, что я нашел в другом месте в литературе (Wikipedia, INTEL руководство по программированию, StackOverflow, ...):Что такое определение опустошения в Z3 терминологии
Я понимаю, что переполнение, когда результат сложения больше, чем наибольшее число, которое может быть представлено, учитывая количество битов, на которых закодированных операнды. Это обычно.
Для underflow я понимаю, что (в терминологии Z3) это когда результат меньше наименьшего целого числа, которое может быть представлено с учетом количества бит, на котором закодированы операнды. Это нормально, но необычно в литературе из того, что я видел (например, wikipedia), поскольку это понятие применимо только к числам с плавающей запятой.
В Intel программирующий вручную, переполнение/сгущенного рассматриваются несут и переполнения флаги:
флаг переноса - Устанавливается, если арифметическая операция генерирует перенос или заимствовать из самой значимой части результата; очищено в противном случае. Этот флаг указывает условие переполнения для арифметики без знака. Он также используется в арифметике с множественной точностью .
Переполнение флаг - Устанавливается, если целочисленный результат слишком велик положительный число или слишком мал, отрицательное число (без знака-бит), чтобы соответствовать в адресате; очищается в противном случае. Этот флаг указывает на условие переполнения для арифметики со знаком целого числа (двух дополнений).
Не могли бы вы подтвердить точное определение нижнего уровня в терминологии Z3?
Я предлагаю добавить это в документацию, а также предполагаемый способ вычитания (первый операнд вычитается из второго операнда и второго операнда, вычитаемого из первого операнда), который выполняется из многих других API Z3.