web-dev-qa-db-ja.com

sizeof(int)== sizeof(long)なのはなぜですか?

以下にリストされているプログラムでは、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;
}
12
ChrisMcJava

私の知る限り、longは8バイトです。これは正しいです?

いいえ、これは正しくありません。 CおよびC++の仕様では、longは32ビット以上である必要があるとのみ規定されています。 intは小さくすることができますが、多くのプラットフォームでは、CおよびC++では、longintは両方とも32ビットです。

これは、 固定幅の整数型を優先int64_tなどが利用可能であり、C99または同等の型を提供するフレームワークを使用している場合に非常に良い理由です。

23
Reed Copsey

CはJavaでもC#でもありません。他の人が書いたように、C仕様には最小の長さと相対的な長さが記載されています。なぜですか?Cは低レベルであり、これまでに作成されたほぼすべてのハードウェアでコンパイルおよび実行されるように設計されています。 。

仕様がプログラマーに約束しすぎると、ハードウェアがそのようなことをサポートしていないときに、その実装はトリッキー(そして遅く)になる可能性があります。 JavaそしてC#開発者はあまり気にしません、彼らはより高いレベルの仕事のための彼らの言語の便利さを好み、すべての約束を果たすことを世話する大きな仮想マシンをインストールすることを躊躇しません(または少なくともそれらのほとんど)。

Cプログラマーは、マシン命令レベルでもコードを制御したいと考えています。ハードウェアを完全に制御します。この方法でのみ、すべてのハードウェア機能を使用でき、最大のパフォーマンスを実現できます。ただし、使用しているハードウェアについての想定には注意する必要があります。いつものように、大きな力には大きな責任が伴います。

これを説明するために:Cは8ビットバイトを想定していません。見る CHAR_BIT in <limits.h>

関連する質問は Cの整数のサイズ です。

4
Palec

それはあなたのABIに依存します。 Windowsを使用している場合、MicrosoftはLLP64モデルを選択したため、longintはどちらも32ビットですが、long longとポインタは、レガシーの理由から、64ビットビルドでは64ビットです。

ほとんどのUNIXプラットフォームはLP64モデルを選択しました。これにより、int 32ビット、longlong long、および64ビットビルドの場合は64ビットのポインター。

しかし、Reed Copseyが指摘しているように、規格には最小の長さと相対的な長さしか記載されていません。また、longintの長さ以上である必要があります。

4
chmeee

いいえ、標準では、long4 bytesであり、int2 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です。

3
Shafik Yaghmour