8

32 ビット プロセッサの長さが実際には 32 ビットしかない場合、64 ビットの数値に対してどのように数学演算を行うことができるでしょうか? 例えば:

long lngTemp1 = 123456789123;
long lngTemp2 = lngTemp1 * 123;

MSDN によると、C# の long は符号付きの 64 ビット数値です: http://msdn.microsoft.com/en-us/library/ctetwysk(VS.71).aspx

32 ビットの Intel マイクロプロセッサが、オーバーフローを起こさずに上記のようなコードを実行できるのはなぜですか?

4

3 に答える 3

5

これらは、加算と減算にキャリー ビットを使用します。「キャリー付き加算」および「キャリー付き減算」(または「ボロー」) のアセンブラー演算は、任意のビット長拡張精度の加算および減算に使用できます。

乗算の場合、乗算の結果が 32 ビットしかない場合は、それを 16 ビットの値のペアに分割して乗算し、次にシフトと加算 (キャリーあり) を行って、32 ビットの乗算から完全な 64 ビットの結果を得ることができます。基本的に、ロングハンド バージョン (任意の 2 つの 16 ビット乗算が 32 ビットの結果に収まる) を実行すると、より制限された精度を使用して任意のビット長の乗算を生成できます。

FWIW、インテルの 32 ビット asm "mul" 命令は 64 ビットの結果を EDX:EAX に入れることができるため、実際には 16 ビットのチャンクではなく 32 ビットのチャンク (追加する 64 ビットの値) で乗算を行うことができます (シフトして加算する 32 ビット値を使用)。

于 2010-07-06T20:57:26.197 に答える
0

x86 の 32 ビット命令セットは、64 ビット演算に使用できます 。Extended Precision Multiplicationを参照してください。

于 2010-07-06T20:57:01.050 に答える
0

32 ビット プロセッサでさえ、多くの場合 64 ビットの浮動小数点ユニットが付属していましたが、データは一度に 32 ビットでしかバス化できませんでした。

ただし、より一般的には、基礎となるプロセッサが 8 ビット整数演算しか許可していない場合でも、64 ビット浮動小数点を実現できます。ただし、コンパイラまたはプログラマは、効果を仮想化するために十分なコードを挿入する必要があります。

于 2010-07-06T20:58:06.333 に答える