以下にリストされているプログラムでは、sizeof(int)とsizeof(long)は私のマシンでは同じです(両方とも4バイト(または32ビット)に等しい)。私の知る限り、longは8バイトです。これは正しいです?私は64ビットマシンを持っています
#include <stdio.h>
#include <limits.h>
int main(void){
printf("sizeof(short) = %d\n", (int)sizeof(short));
printf("sizeof(int) = %d\n", (int)sizeof(int));
printf("sizeof(long) = %d\n", (int)sizeof(long));
printf("sizeof(float) = %d\n", (int)sizeof(float));
printf("sizeof(double) = %d\n", (int)sizeof(double));
printf("sizeof(long double) = %d\n", (int)sizeof(long double));
return 0;
}
私の知る限り、longは8バイトです。これは正しいです?
いいえ、これは正しくありません。 CおよびC++の仕様では、longは32ビット以上である必要があるとのみ規定されています。 int
は小さくすることができますが、多くのプラットフォームでは、CおよびC++では、long
とint
は両方とも32ビットです。
これは、 固定幅の整数型を優先int64_t
などが利用可能であり、C99または同等の型を提供するフレームワークを使用している場合に非常に良い理由です。
CはJavaでもC#でもありません。他の人が書いたように、C仕様には最小の長さと相対的な長さが記載されています。なぜですか?Cは低レベルであり、これまでに作成されたほぼすべてのハードウェアでコンパイルおよび実行されるように設計されています。 。
仕様がプログラマーに約束しすぎると、ハードウェアがそのようなことをサポートしていないときに、その実装はトリッキー(そして遅く)になる可能性があります。 JavaそしてC#開発者はあまり気にしません、彼らはより高いレベルの仕事のための彼らの言語の便利さを好み、すべての約束を果たすことを世話する大きな仮想マシンをインストールすることを躊躇しません(または少なくともそれらのほとんど)。
Cプログラマーは、マシン命令レベルでもコードを制御したいと考えています。ハードウェアを完全に制御します。この方法でのみ、すべてのハードウェア機能を使用でき、最大のパフォーマンスを実現できます。ただし、使用しているハードウェアについての想定には注意する必要があります。いつものように、大きな力には大きな責任が伴います。
これを説明するために:Cは8ビットバイトを想定していません。見る CHAR_BIT
in <limits.h>
。
関連する質問は Cの整数のサイズ です。
それはあなたのABIに依存します。 Windowsを使用している場合、MicrosoftはLLP64モデルを選択したため、long
とint
はどちらも32ビットですが、long long
とポインタは、レガシーの理由から、64ビットビルドでは64ビットです。
ほとんどのUNIXプラットフォームはLP64モデルを選択しました。これにより、int
32ビット、long
、long long
、および64ビットビルドの場合は64ビットのポインター。
しかし、Reed Copseyが指摘しているように、規格には最小の長さと相対的な長さしか記載されていません。また、long
はint
の長さ以上である必要があります。
いいえ、標準では、long
が4 bytes
であり、int
が2 bytes
である最小値が定義されています。 C99ドラフト標準 セクション5.2.4.2.1
整数型のサイズ段落1は言う:
[...]それらの実装定義値は、大きさが同じかそれ以上でなければなりません[...]
long
の場合、次のようになります。
LONG_MIN -2147483647 // -(2^31 - 1)
LONG_MAX +2147483647 // 2^31 - 1
これは4 bytes
です。完全を期すために、int
には次のものがあります。
INT_MIN -32767 // -(2^15 - 1)
INT_MAX +32767 // 2^15 - 1
これは2 bytes
です。