12

[C++11: 1.7]ビットの観点からバイトについて話します:

C++メモリモデルの基本的なストレージユニットはバイトです。バイトは、少なくとも基本実行文字セット(2.3)のメンバーとUnicode UTF-8エンコード形式の8ビットコードユニットを含むのに十分な大きさであり、連続するビットシーケンスで構成されます。実装定義。最下位ビットは下位ビットと呼ばれます。最上位ビットは上位ビットと呼ばれます。C ++プログラムで使用可能なメモリは、連続するバイトの1つ以上のシーケンスで構成されます。すべてのバイトには一意のアドレスがあります。

しかし、「ビット」を定義する規格のどこにも見つかりません。

では、C ++は、1ビットで表すことができる値の数に制限を設けていないと言うのは本当ですか?

たとえば、トライステートビットを許可しますか?

4

3 に答える 3

6

にリストされている規範的な参考文献の中に[C++11: 1.2]は、「ISO / IEC 9899:1999、プログラミング言語—C」があります。

次に、この規格は次のように述べています。

[C99: 3.5]: 2つの値のいずれかを持つ可能性のあるオブジェクトを保持するのに十分な大きさの実行環境内の1ビット単位のデータストレージ

これは、ビットがさらに大きなデータストレージの単位であることを排除するものではないため、言語としてのC++は実際にトライステートビットをサポートできます。

于 2012-09-29T19:41:43.610 に答える
1

仕様で明示的に許可されている三元マシンでエミュレートできるため、受け入れられた回答には同意しません。

§ 3.9.1/4 符号なしと宣言された符号なし整数は、モジュロ 2 nの算術法則に従うものとします。ここで、n は整数の特定のサイズの値表現のビット数です。
§ 1.8/5 簡易コピー可能または標準レイアウト タイプ (3.9) のオブジェクトは、ストレージの連続したバイトを占有するものとします。
§ 3.9/9 算術型 (3.9.1)... をまとめてスカラー型と呼びます。スカラー型、... そのような型の配列... はまとめて POD 型と呼ばれます。スカラー型...、そのような型の配列... は、まとめて自明にコピー可能な型と呼ばれます。
§ 3.8/2 自明にコピー可能な type のオブジェクトについてTは、オブジェクトが type の有効な値を保持しているかどうかにかかわらず、オブジェクトを構成する基礎となるバイトをまたはTの配列にコピーできます。charunsigned char. charまたはの配列の内容がunsigned charオブジェクトにコピーされた場合、オブジェクトはその後元の値を保持します。

ここでの問題は、すべての時点で、自明にコピー可能なすべてのマルチバイト オブジェクトの状態が、配列にコピー可能であり、char失われることなく元に戻されなければならないことです。これは、基数 2 のマシンをエミュレートする 3 進マシン (モジュロ「ロールオーバー」を持つ基本的な算術型で必要とされる) が、すべての符号なしマルチバイト算術演算で、エミュレートされた各バイトから次のバイトへのロールオーバーをエミュレートする必要があることを意味します。

これでも 3 進マシンでゆっくりとエミュレートできますが、すべてのプリミティブ型が正確に 41 トリットで構成されている場合、コンパイラが心配しなければならないのは符号なしロールオーバー/アンダーだけであり、実行可能かもしれません。^(明らかに、|をエミュレートするのも遅いですが、それは私の考えではそれほど問題ではありません)それは可能&だと思いますが、標準に準拠した C++ コンパイラを三元マシン用に作成することは驚くほど非現実的です。

于 2013-01-04T23:29:17.820 に答える