問題タブ [unspecified-behavior]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - C++14 は、unsigned int のパディング ビットに対するビット演算子の動作を定義していますか?
C++ 標準
C++14
実装が の基になるバイトにパディング ビットを含む場合、パディング ビットunsigned int
に対してビット単位の演算を実行してはならないかどうかを標準で指定していますか?
さらに、C++14 標準では、等価演算子と関係演算子がパディング ビットを無視する必要があるかどうかを指定していますか?
ガイドライン
その問題に関する仕様が不足している場合、パディング ビットに対するこれらの演算子の予想される動作について何らかのコンセンサスがありますか?
Stack Overflow で矛盾する回答を見つけました。Lightness Races in Orbitとecatmurは、ビット単位の演算子はすべてのビット (パディング ビットを含む) に適用されるため、算術には適していないと述べていますが、ChristophとBartek Banachewiczは、ビット単位の演算子は整数の論理値に作用し、パディングを無視すると述べています。
参考文献
関連する回答: パディング ビットの存在 ( 1、 2、 3 )、明確な C++ 仕様の欠如 ( 4 )。
C++14でのパディング ビットの定義- § 3.9.1 - 基本型:
ナロー文字型の場合、オブジェクト表現のすべてのビットが値表現に参加します。符号なしのナロー文字型の場合、値表現の可能なすべてのビット パターンは数値を表します。これらの要件は、他のタイプには当てはまりません。
C++14 におけるオブジェクト表現と値表現の定義 - § 3.9 - 型:
type のオブジェクトのオブジェクト表現は、 typeのオブジェクトによって取り上げられるN 個
T
のオブジェクトのシーケンスです。ここで、Nは等しいです。オブジェクトの値表現は、 type の値を保持するビットのセットです。自明にコピー可能な型の場合、値の表現は、実装定義の値のセットの 1 つの離散要素であるvalueを決定するオブジェクト表現のビットのセットです。44unsigned char
T
sizeof(T)
T
脚注 44) その意図は、C++ のメモリ モデルが ISO/IEC 9899 プログラミング言語 C のメモリ モデルと互換性があることです。
C++14 でのビット単位の AND の定義 - § 5.11 - ビット単位の AND 演算子:
通常の算術変換が実行されます。結果は、オペランドのビットごとの AND 関数です。演算子は、整数またはスコープなしの列挙型オペランドにのみ適用されます。
C++14 における加算の定義 - § 5.7 - 加算演算子:
通常の算術変換は、算術型または列挙型のオペランドに対して実行されます。さらに、[...] 両方のオペランドが算術またはスコープなしの列挙型 [...] を持つ必要があります。二項演算子の結果は
+
、オペランドの合計です。