long intのサイズは常に4バイトと考えていいのでしょうか?
質問
常に
long int
(の同義語であると理解しています)。
long
) は
4
のバイトですか?
に頼っていいのでしょうか? もしそうでなければ、POSIXベースのOSではそうなる可能性がありますか?
どのように解決するのですか?
標準では、以下のような整数型の正確なサイズについては何も述べていません。
char
. 典型的には
long
は、32 ビットシステムでは 32 ビット、64 ビットシステムでは 64 ビットです。
しかし、この規格では 最小 のサイズを指定しています。 の 5.2.4.2.1 節から、この規格は C規格 :
<ブロッククオート
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
は
は最低でも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 で正確な幅の型が示されています。 規格では、これらの型定義はオプションであると述べていますが、ほとんどの実装で存在しています。
関連
-
コンパイルエラー:可変長オブジェクトが初期化されていない可能性があります。
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] const int*、const int * const、int const *の違いは何ですか?
-
[解決済み] C言語で配列のサイズを決定するにはどうすればよいですか?
-
[解決済み] Cプリプロセッサはなぜ "linux "という単語を定数 "1 "と解釈するのですか?
-
[解決済み] php.iniはどこにありますか?
-
[解決済み] mysqlのint(11)のカラムのサイズは何バイトですか?
-
[解決済み] char s[]とchar *sの違いは何ですか?
-
[解決済み] FortranはC言語よりも重い計算を最適化しやすいですか?
-
[解決済み】SO_REUSEADDRとSO_REUSEPORTはどう違うのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
error: 'for' loop initial declaration is only allowed in C99 mode 原因と解決方法
-
未定義の `__isoc99_sscanf' への参照
-
[解決済み] C関数から文字列を返す
-
[解決済み] mallocの結果はキャストするのですか?
-
[解決済み] C言語のコードで「:-!」とは何ですか?
-
[解決済み] 難読化Cコードコンテスト2006。sykes2.cの解説をお願いします。
-
[解決済み] プログラム終了前にmallocの後にfreeをしないと本当に何が起こるのか?
-
[解決済み] C言語標準に準拠した構造体の初期化方法
-
[解決済み] C言語でオブジェクト指向のコードを書くとしたら、どのようにすればよいのでしょうか?[クローズド]
-
[解決済み] C言語でファイルが存在するかどうかを確認する最も良い方法は何ですか?