long int
16 ビット CPUのサイズに問題があります。そのアーキテクチャを見る:
レジスタの長さが 16 ビットを超えることはありません。では、long int
なぜ 16 ビットを超えることができるのでしょうか。実際、どのプロセッサについても、データ型の最大サイズは汎用レジスタのサイズでなければなりません。私は正しいですか?
long int
16 ビット CPUのサイズに問題があります。そのアーキテクチャを見る:
レジスタの長さが 16 ビットを超えることはありません。では、long int
なぜ 16 ビットを超えることができるのでしょうか。実際、どのプロセッサについても、データ型の最大サイズは汎用レジスタのサイズでなければなりません。私は正しいですか?
はい。実際、C および C++ 標準ではsizeof(long int) >= 4
.*が必要です。
(この場合は想定CHAR_BIT == 8
しています。)
これは、32 ビット マシンでの 64 ビット整数の扱いと同じです。実装方法は、下半分と上半分を表すために 2 つのレジスタを使用することです。
加算と減算は、次の 2 つの命令として実行されます。
x86 の場合:
add
そして、 「キャリー付き加算」はadc
どこにありますか?adc
sub
ますかsbb
sbb
例えば:
long long a = ...;
long long b = ...;
a += b;
次のようにコンパイルされます。
add eax,ebx
adc edx,ecx
eax
とは の下部edx
と上部ですa
。そしてebx
とecx
は の下部と上部ですb
。
ダブルワード整数の乗算と除算はより複雑ですが、同じ種類の小学校の数学に従いますが、各「桁」はプロセッサワードです。
いいえ。マシンに 32 ビット値を処理できるレジスタがない場合は、ソフトウェアでシミュレートする必要があります。これは、任意精度演算のライブラリで使用されているのと同じ手法を使用して行うことができます。