- ベストアンサー
C言語の定数のサフィックスについて
- C言語で定数を扱う際に一定以上のサイズの定数の場合L、UL等のサフィックスを付けないと正常に処理されない
- int、long等は処理系によってサイズが変わるが、32bit以下の定数はサフィックス不要、32bitを超える場合はサフィックスが必要
- 処理系に依存せず一定サイズの変数を宣言する場合はint32_t、int64_tを使用するが、定数の場合はサフィックスを使用することで処理が保証される
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
int32_t, int64_tの型が使えるのでしたら INT32_C(n), INT64_C(n)などが使えるはずです。
その他の回答 (3)
- colder
- ベストアンサー率43% (30/69)
>long longが32bitの場合 そんな場合無いから、long longは最低でも64bitあることが保証されています。
お礼
ご回答ありがとう御座います。 あるサイトに long longのサイズは概ね64ビット以上の処理系依存のサイズを持つが C言語の仕様上はchar ≦ short ≦ int ≦ long ≦ long long とだけ定義されていていると記載されていた為、long longが64bit未満の場合もあるのではと思ったのですが、No.2の回答のように64bitが扱えない訳ですからlong longの件は無意味な質問でした。
- Gotthold
- ベストアンサー率47% (396/832)
> 言語で定数を扱う際に一定以上のサイズの定数の場合L、UL等の > サフィックスを付けないと正常に処理されない > (例:0x0123456789ABCDEFという定数はサフィックス無しだと > 0x89ABCDEFとして処理される)仕様になっている いいえ、そのような仕様にはなっていません。 例えばサフィックス無しの10進数整数リテラルがintの範囲に収まらなかった場合は、 long → long long の順でその値を表現できる型に自動的に昇格します。 また、昇格しても表現できないほど大きい数値の場合はエラーになります。 8/16進数整数リテラルの場合は以下のような順序で、unsignedに昇格することもあります。 unsigned int → long → unsigned long → long long → unsigned long long 例えば、int型が4バイト、long long型が8バイトの環境では以下のような結果になります。 ============================================ #include <stdio.h> int main(){ printf("%d\n", sizeof(int)); //→4 printf("%d\n", sizeof(long long)); //→8 printf("%d\n", sizeof(1)); //→4 printf("%d\n", sizeof(4294967296)); //→8 //printf("%d\n", sizeof(18446744073709551616)); //これはエラー return 0; } ============================================ > 例えば0x0123456789ABCDEFULLとした場合、long longが32bitの場合は32bitの定数として扱われてしまうと思うのですが、 > 定数を処理系に依存せずに確実に64bitとして処理してほしい場合はどの様にすれば良いのでしょうか? long longが32bitの場合は、その処理系はそもそも64bitを扱うことが不可能でしょう。 コンパイルさえできません。
- maiko0333
- ベストアンサー率19% (839/4401)
intで定義した変数はそのまま(int)書く。 longで定義したものはLを必ず書く。 int i = 1; long j= 2L; Lについては小文字で書くとlとなり、1と間違うのでLと書いてください。
お礼
お礼が遅くなり申し訳ありません。 基本的にはint(int変数に代入する定数)の場合はサフィックス無しでOK、long(long変数に代入する定数)の場合はサフィクスLが必要な事は把握しています。 質問をさせて頂いた経緯は処理系に依存するintやlongでの変数宣言はしたくなかったのでint32_t、int64_t等を使いたいのですが、もし処理系のintサイズが16bitの場合はint32_tで宣言した変数にもサフィクスが必要なのかを確認したかったという物です。
お礼
ご回答ありがとう御座います。 >INT32_C(n), INT64_C(n) 上記の存在は知りませんでした、大変役に立ちました。