10

C++ 標準

C++14 実装が の基になるバイトにパディング ビットを含む場合、パディング ビットunsigned intに対してビット単位の演算を実行してはならないかどうかを標準で指定していますか?

さらに、C++14 標準では、等価演算子と関係演算子がパディング ビットを無視する必要があるかどうかを指定していますか?

ガイドライン

その問題に関する仕様が不足している場合、パディング ビットに対するこれらの演算子の予想される動作について何らかのコンセンサスがありますか?

Stack Overflow で矛盾する回答を見つけました。Lightness Races in Orbitecatmurは、ビット単位の演算子はすべてのビット (パディング ビットを含む) に適用されるため、算術には適していないと述べていますが、ChristophBartek Banachewiczは、ビット単位の演算子は整数の論理値に作用し、パディングを無視すると述べています。

参考文献

関連する回答: パディング ビットの存在 ( 123 )、明確な C++ 仕様の欠如 ( 4 )。

C++14でのパディング ビットの定義- § 3.9.1 - 基本型:

ナロー文字型の場合、オブジェクト表現のすべてのビットが値表現に参加します。符号なしのナロー文字型の場合、値表現の可能なすべてのビット パターンは数値を表します。これらの要件は、他のタイプには当てはまりません。

C++14 におけるオブジェクト表現と値表現の定義 - § 3.9 - 型:

type のオブジェクトのオブジェクト表現は、 typeのオブジェクトによって取り上げられるN 個Tのオブジェクトのシーケンスです。ここで、Nは等しいです。オブジェクトの値表現は、 type の値を保持するビットのセットです。自明にコピー可能な型の場合、値の表現は、実装定義の値のセットの 1 つの離散要素であるvalueを決定するオブジェクト表現のビットのセットです。44 unsigned charTsizeof(T)T

脚注 44) その意図は、C++ のメモリ モデルが ISO/IEC 9899 プログラミング言語 C のメモリ モデルと互換性があることです。

C++14 でのビット単位の AND の定義 - § 5.11 - ビット単位の AND 演算子:

通常の算術変換が実行されます。結果は、オペランドのビットごとの AND 関数です。演算子は、整数またはスコープなしの列挙型オペランドにのみ適用されます。

C++14 における加算の定義 - § 5.7 - 加算演算子:

通常の算術変換は、算術型または列挙型のオペランドに対して実行されます。さらに、[...] 両方のオペランドが算術またはスコープなしの列挙型 [...] を持つ必要があります。二項演算子の結果は+、オペランドの合計です。

4

2 に答える 2

0

実装が埋め込みビットを含む整数型のストレージ形式を指定する場合、オブジェクトが書き込まれるときにそのようなビットに好きなものを書き込むことができ、そのようなビットが保持しなければならない値に適合すると思われる任意の要件を課すことができ、任意の方法で動作します。その要件が満たされない場合、次の 2 つの制約があります。

  1. そのようなタイプのオブジェクトへの書き込みで特定のビット パターンが生成された場合、そのビット パターンは受け入れ可能である必要があり、そのタイプのオブジェクトから読み取ったときに同じ値を生成する必要があります。

  2. 整数型オブジェクトのすべてのビットがゼロの場合、そのオブジェクトは有効であると見なされ、ゼロを読み取らなければなりません。

実装が読み取り時にパディング ビットを無視する場合、ビット単位の演算子はそれらに影響を与えるか、実装が適切と考える方法で影響を与える可能性があります。マルチバイト整数の「1」ビットの総数が奇数であるときに実装がトラップするが、パリティの合計を偶数にするパディング ビット値を常に書き込む場合、パリティ ビット ベースを計算するためにビット単位の演算子が必要になります。データ ビットに書き込み、適切に書き込みます。

于 2018-01-18T23:15:38.863 に答える