long int
(私の知る限り、long
の同義語です)は4
バイト?
それに頼ることができますか?そうでない場合、POSIXベースのOSに当てはまるでしょうか?
規格では、char
以外の整数型の正確なサイズについては何も述べていません。通常、long
は、32ビットシステムでは32ビット、64ビットシステムでは64ビットです。
ただし、標準ではminimumサイズが指定されています。 C Standard のセクション5.2.4.2.1から:
1以下に示す値は、
#if
前処理指令での使用に適した定数式に置き換えられます。さらに、CHAR_BIT
およびMB_LEN_MAX
を除き、以下は、整数プロモーションに従って変換された対応するタイプのオブジェクトである式と同じタイプの式に置き換えられます。 それらの実装定義の値は、示されているものと同じ大きさ(絶対値)以上であり、同じ符号であるものとする...
タイプ
long int
のオブジェクトの最小値
LONG_MIN
-2147483647 //-(2 ^ 31-1)タイプ
long int
のオブジェクトの最大値
LONG_MAX
+2147483647 // 2 ^ 31-1
これは、long int
mustが最低32ビットである必要があるが、それより大きくなる可能性があることを示しています。 CHAR_BIT
が8のマシンでは、これにより4の最小バイトサイズが得られます。 CHAR_BIT
は16に等しく、long int
は2バイト長です。
これが実際の例です。次のコードの場合:
#include <stdio.h>
int main ()
{
printf("sizeof(long) = %zu\n", sizeof(long));
return 0;
}
Debian 7 i686での出力:
sizeof(long)= 4
CentOS 7 x64での出力:
sizeof(long)= 8
そのため、サイズについての仮定を行うことはできません。特定のサイズの型が必要な場合は、stdint.h
で定義されている型を使用できます。次のタイプを定義します。
int8_t
:符号付き8ビットuint8_t
:符号なし8ビットint16_t
:16ビットに署名uint16_t
:符号なし16ビットint32_t
:32ビットに署名uint32_t
:符号なし32ビットint64_t
:署名された64ビットuint64_t
:符号なし64ビットstdint.h
ヘッダーは標準のセクション7.20で説明されており、正確な幅のタイプはセクション7.20.1.1で説明されています。標準では、これらのtypedefはオプションですが、ほとんどの実装に存在します。
いいえ、C標準もPOSIXもこれを保証しておらず、実際に ほとんどのUnixライクな64ビットプラットフォーム は64ビット(8バイト)long
を持っています。
コードsizeof(long int)
を使用して、サイズを確認します。現在作業しているシステムのlong intのサイズをバイト単位で示します。特にあなたの質問の答えはノーです。 C、POSIX、またはどこでも保証されていません。
@delnanが指摘したように、POSIX実装はlong
とint
のサイズを未指定のままにしており、32ビットシステムと64ビットシステムで異なることがよくあります。
long
の長さは、ほとんどの場合ハードウェア関連です(多くの場合、CPU上のデータレジスタのサイズに一致し、OSデザインやABIインターフェースなどのソフトウェア関連の問題もあります)。
あなたの心を楽にするために、sizeof
は関数ではなく、コンパイラ指令*です。したがって、コードはsizeof
を使用するときに操作を使用しません-それは数字を書くことと同じです。ポータブル。
つかいます:
sizeof(long int)
* Daveがコメントで指摘したように、可変長配列を使用する場合など、コンパイル中に値を計算できない場合、実行時にsizeof
が計算されます。
また、別のコメントで指摘されているように、sizeof
は実装で使用されるパディングとアライメントを考慮します。つまり、使用中の実際のバイトはメモリのサイズとは異なる場合があります)。
特定のバイトサイズの変数を探している場合は、バイト配列または(サポートされていると思われる)stdint.h
-@dbushが示唆するとおり。
ICLシリーズ39ハードウェアに最初にCを実装したときに、Wordで標準を採用し、データ型をshort
= 32ビット、int
であるそのマシンアーキテクチャの自然な表現にマッピングしました。 = 64ビット、long
= 128ビット。
しかし、本格的なCアプリケーションは機能しないことがわかりました。それらはすべて、マッピングshort
= 16、int
= 32、long
= 64を想定しており、それをサポートするようにコンパイラを変更する必要がありました。
公式の標準が何と言っても、長年にわたって誰もがlong
= 64ビットに収束しており、変更される可能性はほとんどありません。
標準 はlong int
のサイズについて何も示していないため、使用している環境に依存します。
環境のlong int
のサイズを取得するには、sizeof
演算子を使用してlong int
のサイズを取得できます。何かのようなもの
sizeof(long int)
C標準では、型のサイズについて次の点のみが必要です。
- int> = 16ビット、
- long> = 32ビット、
- long long(C99以降)> = 64ビット
- sizeof(char)<= sizeof(short)<= sizeof(int)<= sizeof(long)<= sizeof(long long)
- sizeof(char)== 1
- CHAR_BIT> = 8
残りは実装が定義されているため、intが18/24/36/60ビット、補数の符号付き形式、sizeof(char)== sizeof(short)== sizeof(int)==を持つシステムに遭遇しても驚くことではありませんsizeof(long)== 4、標準の委員会が気にするエキゾチックなアーキテクチャのような48ビットの長さまたは9ビットの文字とC標準でサポートされるプラットフォームのリスト
上記のlong intに関するポイントは完全に間違っています。ほとんどのLinux/Unix実装はlongを64ビットタイプとして定義しますが、Windowsでは異なるデータモデルを使用するため、32ビットのみです(こちらの表をご覧ください 64ビットコンピューティング )。 32ビットまたは64ビットのOSバージョンに関係なく。
コンパイラーは、ハードウェアとOSのタイプに基づいてサイズを決定します。
そのため、サイズに関して仮定するべきではありません。
srmiscのブログ: から
標準では完全にコンパイラーに委ねられているため、同じコンパイラーがオプションやターゲットアーキテクチャに依存することもあります。
できません。
ちなみにlong int
はlong
と同じです。
短い答え:いいえ! _long int
_のサイズを固定した仮定を立てることはできません。なぜなら、標準(C標準またはPOSIX)は_long int
_のサイズを文書化していないからです(繰り返し強調されるように)。あなたの信念に反例を提供するために、64ビットシステムのほとんどはサイズが64のlong
を持っています!移植性を最大化するには、sizeof
を適切に使用します。
sizeof(long int)
を使用してサイズを確認し、long
のサイズをバイト単位で返します。値はシステムまたは環境に依存します。つまり、コンパイラはハードウェアとOSに基づいてサイズを決定します。