私は標準的な参考文献を熟読するのに時間を費やしましたが、次の答えを見つけることができませんでした:
- 符号付き整数型 S とその対応する符号なし U が与えられた場合、可能な各 S の絶対値は常に U の最大値以下であることが C/C++ 標準によって技術的に保証されていますか?
私が得た最も近いものは、C99 標準のセクション6.2.6.2からのものです (C++ の文言は私には難解ですが、これは同等であると思います):
符号付き整数型の場合、オブジェクト表現のビットは、値ビット、パディング ビット、符号ビットの 3 つのグループに分けられます。(...) 値ビットである各ビットは、対応する符号なし型のオブジェクト表現の同じビットと同じ値を持つものとします (符号付き型に M 個の値ビットがあり、符号なし型に N 個の値ビットがある場合、M≤ N)。
したがって、架空の 4 ビット符号付き/符号なし整数型では、符号なし型が 1 つのパディング ビットと 3 つの値ビットを持ち、符号付き型が 3 つの値ビットと 1 つの符号ビットを持つことを妨げるものはありますか? このような場合、符号なしの範囲は [0,7] になり、符号付きの場合は [-8,7] になります (2 の補数を仮定)。
誰かが興味を持っている場合に備えて、私は現時点で、最初に符号なしの対応するものへのキャスト、次に単項マイナス演算子の適用からなる負の整数の絶対値を抽出する手法に依存しています (そのため、たとえば - 3 はキャストによって 4 になり、次に単項マイナスによって 3 になります)。これは、unsigned 型で表すことができなかった -8 の上記の例では壊れます。
編集: Keith と Potatoswatter 以下の返信に感謝します。さて、私の最後の疑問点は、標準の文言における「サブレンジ」の意味です。それが厳密に「未満」の包含を意味する場合、上記の私の例と以下のキースの例は標準に準拠していません。サブ範囲が潜在的に unsigned の全範囲であることを意図している場合、それらはそうです。