質問: -10; if (i >> 31) puts("OK"); } ``` 仮に、右シフトの実装が算術シフト、または論理シフトに限られ、純粋2進表現における2の補数が必ず最上位bitを符号bitとして扱うのであれば問題なく動くような気がしています。 によると、 > > 右シフト演算は算術(signed)シフトあるいは論理(unsigned)シフトのいずれかで実装される。 > > > となっていますが・・・ 符号bitが変なところにあったり算術シフト、論理シフト以外が使われる可能性はあるでしょうか? その他問題点があればご指摘いただきたいです。
回答: ごく普通に `if (i<0)` でダメな理由が知りたいです。妙なテクニックに走られても後から読む人(には数か月後の自分が含まれます)が困惑するだけです。バレルシフタが無い CPU では真に31回シフトを行うコードが生成されてしまう可能性があり、単純比較と比して31倍遅い機械語が生成される可能性があります。ましてや 64bit 型など使ったらどうなるか。 この辺、言語規格書の版によって異なる可能性があります。 c++](/questions/tagged/c%2b%2b "'c++' のタグが付いた質問を表示") では [C++20 では2の補数のみ規定 なる改版が行われており、提示の命題は C++20 では真です。それより古い C++03 や C++11 等では下記 [c](/questions/tagged/c "'c' のタグが付いた質問を表示") と同様。 # 文言「2の補数」は暗黙のうちに詰め物なし符号ビットは最上位を含意するため c](/questions/tagged/c "'c' のタグが付いた質問を表示") においてはいまだに [1の補数系で -0 と +0 は等しいか 1の補数であるとかげたばき記法とかを拒絶していなかったはず。その意味で提示の命題は偽です。 とはいえ コンピュータ内では2の補数が使われていますか1の補数が使われていますか でも書きましたが、現代に生き残っている CPU は2の補数を採用しているものばかりです。情報工学科の課題とかで1の補数な CPU を設計・作成してオレオレコンパイラを実装する・・・みたいな例でもない限りは提示の命題が偽になることはないと思われます。