長い64ビットを作成し、128ビットの数値が現実になるまで長く予約する方が理にかなっているのではないでしょうか。
6 に答える
はい、それは理にかなっていますが、Microsoftには「long」を32ビットとして定義する独自の理由がありました。
私の知る限り、現在のすべての主流システムの中で、「長い」が32ビットであるOSはWindowsだけです。UnixおよびLinuxでは、64ビットです。
Windows用のすべてのコンパイラは、Microsoftとの互換性を維持するために、Windows上で「長い」32ビットにコンパイルします。
このため、「int」と「long」の使用は避けています。エラーコードとブール値(C)には「int」を使用することがありますが、型のサイズに依存するコードには使用しません。
c標準では、プリミティブデータ型のビット長は指定されていませんが、それらの最小ビット長のみが指定されています。したがって、コンパイラは、プリミティブデータ型のビット長に関するオプションを持つことができます。各プリミティブデータ型のビット長を決定する際、コンパイラの設計者は、コンピュータアーキテクチャを含むいくつかの要因を考慮する必要があります。
ここにいくつかの参照があります:http: //en.wikipedia.org/wiki/C_syntax#Primitive_data_types
歴史的な理由から。長い間(しゃれを意図して)、「int」は16ビットを意味していました。したがって、32ビットとして「長い」。もちろん、時代は変わりました。したがって、「長い長い」:)
PS:
GCC(およびその他)は現在、「(u)int128_t」として128ビット整数をサポートしています。
PPS:
GCCの人々が彼らが行った決定をした理由の議論はここにあります:
http://www.x86-64.org/pipermail/discuss/2005-August/006412.html
汎用の再プログラム可能なマイクロコンピューター用の最初のCコンパイラーの時代以来、コードは正確に8、16、または32ビットを保持する型を使用する必要がありましたが、1999年まで、標準は明示的に提供していませんでした。プログラムがそれを指定するための任意の方法。一方、8ビット、16ビット、および32ビットのマイクロコンピュータ用のほぼすべてのコンパイラは、「char」を8ビット、「short」を16ビット、「long」を32ビットと定義しています。それらの間の唯一の違いは、「int」が16ビットであるか32ビットであるかです。
32ビット以上のCPUは「int」を32ビットタイプとして使用し、「long」を64ビットタイプとして使用できるようにすることができますが、「long」が32ビットになることを期待するコードの実質的なコーパスがあります。C標準は1999年に「固定サイズ」タイプを追加しましたが、「printf」など、まだ「int」と「long」を使用している他の場所が標準にあります。C99は、固定サイズの整数型に適切な形式指定子を提供するためにマクロを追加しましたが、「%ld」がほぼすべての8ビットで機能するため、int32_tの有効な形式指定子であると想定するコードの実質的なコーパスがあります。 、16ビット、または32ビットプラットフォーム。
識別のためのより冗長な「longlong」または「int64_t」の必要性を回避するために、数十年前の既存のコードベースを尊重して「long」を32ビットにする方が理にかなっているのか、64ビットか64ビット型はおそらく判断の呼びかけですが、新しいコードは実用的な場合は指定されたサイズの型の使用を優先するはずなので、「int」でない限り「長い」64ビットを作成することの魅力的な利点がわかるかどうかはわかりません。また、64ビットです(これにより、既存のコードでさらに大きな問題が発生します)。
d 32ビットマイクロコンピュータは、「char」を8ビット、「short」を16ビット、「long」を32ビットと定義しています。それらの間の唯一の違いは、「int」が16ビットであるか32ビットであるかです。
32ビット以上のCPUは「int」を32ビットタイプとして使用し、「long」を64ビットタイプとして使用できるようにすることができますが、「long」が32ビットになることを期待するコードの実質的なコーパスがあります。C標準は1999年に「固定サイズ」タイプを追加しましたが、「printf」など、まだ「int」と「long」を使用している他の場所が標準にあります。C99はマクロを追加して
long
とのサイズlong long
は実装で定義されており、私たちが知っているのは次のとおりです。
- 最小サイズ保証
- タイプ間の相対的なサイズ
5.2.4.2.1整数型のサイズ<limits.h>
は、最小サイズを示します。
1 [...]それらの実装定義値は、示されている値と同じかそれ以上の大きさ(絶対値)でなければなりません[...]
- UCHAR_MAX 255 // 2 8 − 1
- USHRT_MAX 65535 // 2 16 − 1
- UINT_MAX 65535 // 2 16 − 1
- ULONG_MAX 4294967295 // 2 32 − 1
- ULLONG_MAX 18446744073709551615 // 2 64 − 1
6.2.5タイプは次のように言います:
8符号が同じで整数変換ランクが異なる2つの整数タイプ(6.3.1.1を参照)の場合、整数変換ランクが小さいタイプの値の範囲は、他のタイプの値のサブ範囲です。
6.3.1.1ブール、文字、および整数は、相対的な変換ランクを決定します。
1すべての整数型には、次のように定義された整数変換ランクがあります。
- long long intのランクは、long intのランクよりも大きく、intのランクよりも大きく、short intのランクよりも大きく、signedcharのランクよりも大きくなければなりません。
- 符号なし整数型のランクは、対応する符号付き整数型がある場合はそのランクと等しくなります。
- すべての整数型T1、T2、およびT3について、T1のランクがT2よりも大きく、T2のランクがT3よりも大きい場合、T1のランクはT3よりも大きくなります。