n3337.pdfドラフト5.3.1.8には、次のように記載されています。
単項演算子のオペランドは、
-
算術型またはスコープなしの列挙型でなければならず、結果はそのオペランドの否定になります。汎整数拡張は、積分オペランドまたは列挙オペランドで実行されます。符号なし数量の負の数は、2ⁿからその値を減算することによって計算されます。ここで、nはプロモートされたオペランドのビット数です。結果のタイプは、プロモートされたオペランドのタイプです。
場合によってはそれで十分です。unsigned intが32ビット幅(-(0x80000000u)) == 0x80000000u
だとしたら、そうではありませんか?
それでも、符号なし0x80000000の単項マイナスについては何も見つかりません。また、C99標準ドラフトn1336.pdf、6.5.3.3はそれについて何も言っていないようです:
単項演算子の結果は、その(プロモートされた)オペランドの負数です。整数拡張はオペランドで実行され、結果はプロモートされたタイプになります。
UPDATE2:unsignedintが32ビット幅であると仮定しましょう。したがって、問題は、C(符号付きおよび符号なし)の単項マイナス、およびC ++(符号付きのみ)の単項マイナスについてはどうでしょうか。
UPDATE1:実行時の動作とコンパイル時の動作(つまり、定数畳み込み)の両方が興味深いものです。