符号付き整数-28での3演算による論理右シフト。正解は何ですか?
- +203
- +83
- +3
- -3
2の補数-28は11100100です。論理右シフト演算を適用すると、上記のいずれの答えも得られません。
符号付き整数-28での3演算による論理右シフト。正解は何ですか?
2の補数-28は11100100です。論理右シフト演算を適用すると、上記のいずれの答えも得られません。
私はそれがひっかけ問題であることをほぼ確信しています。
インタビュアーは、あなたが「-3」と答えるかどうかを見ていました。もしあなたが (28>>>3 は 3 であるから -28>>>3 は -3 であるという誤った推論で) もしあなたが 2 の補数を理解していないことに彼は気づいたでしょう。
彼は、4 つの選択肢のどれも正しくないと答えてほしいと思っていました。彼はあなたにそうしてほしかった
たぶん、トリックは2の補数表現を想定しないことです。符号と大きさの表現を想定すると、ほとんどのシフト実装には符号ビットが含まれないため、答えは-3になる可能性があります。
符号付き整数を右にシフトすると、多くのことができます。
ただし、この動作は技術的には「実装定義」です。
この投稿を参照してください:シフト演算子 (<<、>>) は C で算術または論理ですか?
次のようなばかげた質問です。
一部の言語 (Java など) では、適切な CPU 命令を持たないプラットフォームが必要な答えを計算するためにいくつか発行する必要があるように、新しい最上位ビットを使用します。 CPU がネイティブに提供する動作。
2 の補数は、負の数の最も一般的な表現です。あなたの質問には、「-28 の 2 の補数は 11100100 です。」と記載されています... 質問の一部として提供されていなかったと思います (そうであれば、回答の後にあるため、少し奇妙です)。まだ...
2 の補数で実行すると...
11100100 >> 3 = 00011100 or 11111100 = 28 or -4
表現が 1 の補数の場合:
11100011 >> 3 = 00011100 or 11111100 = 28 or -3
表現が符号ビット、絶対値の場合:
10011100 >> 3 = 00010011 or 11110011 = 19 or -(127-12)=-115
(note that the question says a logical bit shift, which by definition ignores any possible interpretation of the bits, so the sign bit is shifted along with others)
int の #bits について...私は、それが大きすぎてどのオプションにも一致しない値になるか、そうでなければ違いがないことは明らかだと思います (1 が左に追加されている場合) 1 または 2 の補数)、その問題は無視できます。
したがって、上記の簡単な計算が間違っていない限り、もっともらしいアーキテクチャで正しい可能性がある唯一の答えは -3 ですが、それでも可能性は非常に低いです。結局のところ、彼らが実際にテストして、質問に答えないままにしておく自信がある人を確認したり、答えがどれも正しくない可能性が高いことに注釈を付けたりしていなかったのではないかと思っています....