Представление отрицательных целых чисел
Есть ли в ISO-Prolog какие-либо предписания / рекомендации относительно представления отрицательных целых чисел и операций над ними? 2-е дополнение, может быть?
Как программист / пользователь: Есть ли какие-либо предположения, которые я могу безопасно сделать при выполнении операций на уровне битов над отрицательными целыми числами?
2 ответа
ИСО / МЭК 13211-1 имеет несколько требований к целым числам, но конкретное представление не требуется. Если целочисленное представление ограничено, выполняется одно из следующих условий
7.1.2 Целое число
...
minint = - (* minint)
minint = - (maxint + 1)
Далее, оцениваемые функторы перечислены в 9.4 Битовые функторы, то есть (>>)/2
, (<<)/2
, (/\)/2
, (\/)/2
, (\)/1
, а также xor/2
Реализация определена для отрицательных значений. Например,
8.4.1 (>>) / 2 - сдвиг вправо по битам
9.4.1.1 Описание
...
Значение должно быть реализацией, определенной в зависимости от
является ли сдвиг логическим (заполнение нулями) или арифметическим
(заполните копию знака знака).
Значение должно быть определено реализацией, еслиVS
отрицательно,
или жеVS
больше, чем битовый размер целого числа.
Обратите внимание, что определенная реализация означает, что соответствующий процессор должен документировать это в сопроводительной документации. Поэтому, прежде чем использовать соответствующий процессор, вы должны прочитать руководство.
Де-факто, на данный момент не существует процессора Prolog (который мне известен), который не обеспечивает арифметическое смещение вправо и не использует дополнение 2.
Строго говоря, это два разных вопроса:
Фактическое физическое представление: это не видно на уровне Пролога, и поэтому стандарт совершенно справедливо ничего не говорит об этом. Обратите внимание, что многие системы Prolog имеют два или более внутренних представления (например, два дополнения с фиксированным размером и знаком + величина), но представляют программисту один целочисленный тип.
Результаты побитовых операций: хотя стандарт определяет эти операции, он оставляет большую часть определенной реализации их поведения. Это является следствием (а) отсутствия способа указания ширины битовой комбинации и (б) отсутствия фиксации для конкретного отображения между отрицательными числами и битовыми комбинациями.
Это не только означает, что все побитовые операции с отрицательными числами официально не переносимы, но также имеет любопытный эффект, что результат побитового отрицания полностью определяется реализацией (даже для положительных аргументов): Y is \1
может по закону дать -2, 268435454, 2147483646, 9223372036854775806 и т. д. Все, что вы знаете, это то, что отрицание дважды возвращает исходное число.
К счастью, на практике, похоже, существует консенсус в отношении "Побитовые арифметические операции ведут себя так, как если бы они работали на представлении дополнения до двух неограниченной длины".