1 バイトが 0 ~ 255 の数値を保持することを理解しています。また、16 ビットの数値は 0 ~ 65535 です。
2 つの別個の 8 ビット レジスタを使用して 16 ビットの数値を表現しようとしている場合、どうすればよいですか? 数学はどのように機能しますか?
ありがとう!
計算は次のようになります。
sixteenBitNumber = 256*upperByte + lowerByte;
シフトとビット単位の演算:
sixteenBitNumber = (upperByte<<8) | lowerByte;
ほとんどの CPU では、一部の古い 8 ビット CPU でも、この解釈はハードウェアで行われます。バイトを 16 ビット レジスタの一部にロードするか、16 ビット ペアとして機能する別の 8 ビット レジスタにロードします。単一の 16 ビット数値であるかのようにデータを処理します。
10 進数で 7 と 9 を取って 79 を作るにはどうすればよいですか? (7*10)+9 それとも 12 と 34 で 1234 になりますか? (12*100)+34。0x12 と 0x34 に違いはなく、0x1234 になります。(0x12 * 0x100) + 0x34。ビット シフト (0x12 << 8 ) + 0x34 をよりクリーンにします。できますか、そうです (0x12<<8) | 0x34。
彼らと一緒に働きたいですか?それは簡単です
基数 10 で 2643という数字があるとしましょう。半分に割ると26と43みたいになるよね?2 を掛ける場合、右から左に掛けてキャリーする必要があることはご存知でしょう。そうしてください - 右側を乗算し、オーバーフローがある場合は、それを左側に追加してから、左側を乗算します。
例えば:
(37 82) *2 -> ((37*2) + overflow) + 64 -> (74 + 1) 64 -> 75 64
それがどのように機能したか見てください。部門についても同じことが言えます - 運ぶ必要がありますか? 上位ビットから盗みます。数字を足したり引いたりしたいですか?結局のところ、それほど難しくありません!
2 進数も同じように機能します。
(01110110 10110011) * 10 = (0) <- 1110110(1) <- 01100110
基本的に、下限を計算してから上限を計算してから、オーバーフローを適用します。