ISO-Prolog には、負の整数の表現とその操作に関する処方箋/推奨事項はありますか? 2の補数かな?
プログラマー/ユーザーとしての質問: 負の整数に対してビットレベルの操作を実行するときに安全に行える仮定はありますか?
ISO-Prolog には、負の整数の表現とその操作に関する処方箋/推奨事項はありますか? 2の補数かな?
プログラマー/ユーザーとしての質問: 負の整数に対してビットレベルの操作を実行するときに安全に行える仮定はありますか?
ISO/IEC 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
定義済みの実装とは、準拠するプロセッサが付属のドキュメントでこれを文書化する必要があることを意味することに注意してください。したがって、適合プロセッサを使用する前に、マニュアルを読む必要があります。
事実上、算術右シフトを提供せず、 2 の補数を使用しない現在の Prolog プロセッサはありません (私は認識しています) 。
厳密に言えば、これらは 2 つの異なる質問です。
実際の物理的表現: これは Prolog レベルでは見えないため、標準はそれについて何も言うことがありません。多くの Prolog システムには 2 つ以上の内部表現 (たとえば、2 の補数の固定サイズと符号 + 大きさの bignum) がありますが、プログラマには単一の整数型が提示されることに注意してください。
ビット演算の結果: 標準ではこれらの演算が定義されていますが、その動作の実装の多くは定義されたままになっています。これは、(a) ビット パターンの幅を指定する方法がないこと、および (b) 負の数とビット パターンの間の特定のマッピングにコミットしていないことの結果です。
これは、負の数に対するすべてのビット演算が正式に移植可能でないことを意味するだけでなく、ビット演算の否定の結果が(正の引数の場合でも)完全に実装定義であるという奇妙な効果もあります: Y is \1
-2、268435454、2147483646、 9223372036854775806 など。あなたが知っているのは、2 回否定すると元の数値が返されるということだけです。
実際には、幸いなことに、 「ビット単位の算術演算は、無制限の長さの 2 の補数表現を操作しているかのように動作する」というコンセンサスがあるようです。