4

ビット演算を使用できるデータ型について説明しているチュートリアルはありますか? レディ・エイダが、ビットごとに OR 2 つの Standard.Integer を実行できないと考える理由がわかりません...

$ gnatmake test.adb
gcc -c test.adb
test.adb:50:77: there is no applicable operator "Or" for type "Standard.Integer"
gnatmake: "test.adb" compilation error

本当に?コンパイラが列挙型データ型の AND/OR を実行できないことを言い訳にしました。Character 型に対してビット単位の操作を実行できないことをコンパイラに言い訳しました。私はコンパイラが Unsigned_8 から Character に変換できないことを言い訳にしました。しかし、これは許しがたい。

4

2 に答える 2

13

、、および演算子は、 、モジュラ型、および の 1 次元配列に対して定義されて"and"います。"or""xor"BooleanBoolean

言語は符号付き整数型に対してそれらを定義できたかもしれませんが、符号付き整数を表現できるさまざまな方法を考えると、混乱を招くでしょう。(ほとんどの実装では 2 の補数を使用しますが、他の可能性もあります。)

主張する場合は、次の"or"ような独自のオーバーロードされた演算子を定義できます。

function "or"(Left, Right: Integer) return Integer is
    type Unsigned_Integer is mod 2**Integer'Size;
begin
    return Integer(Unsigned_Integer(Left) or Unsigned_Integer(Right));
end "or";

(これがコンパイルされることを確認しましたが、テストしていません。負の値では失敗すると予想されます。)

ただし、ビットごとの操作を実行する必要がある場合Booleanは、符号付き整数ではなくモジュラー型または配列を使用することをお勧めします。

于 2013-08-21T19:18:16.830 に答える