この質問はおそらく言語弁護士のためのものです。
signedとunsignedintの両方が32ビット幅であると仮定します。n3337.pdfドラフト5.3.1.8に記載されているように、
(-(0x80000000u)) = 0x100000000u-0x80000000u = 0x80000000u
しかし、私は質問に対する答えを見つけることができません:署名された0x80000000の単項マイナスは何になりますか?それはUB、実装定義、または...?
問題は主に実行時の計算に関するものです。
言う
signed int my_minus(signed int i) { return -i;}
....
int main() {
signed int a = -0x7FFFFFFF; // a looks like 0x80000001
signed int b = a - 1; // b looks like 0x80000000
std::cout << my_minus(b);
....
}
それでも、他の2つのケースについてのコメントは大歓迎です。
コンパイル時定数畳み込み、たとえば、
-(INT_MIN)
のコンパイル時の計算
constexpr
(コンパイル時の定数畳み込みとの違いがある場合)。
(重複に投票する前に、 https://meta.stackexchange.com/questions/123713/is-splitting-a-question-a-good-practiceを参照してください。)