• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語の定数のサフィックスについて)

C言語の定数のサフィックスについて

このQ&Aのポイント
  • C言語で定数を扱う際に一定以上のサイズの定数の場合L、UL等のサフィックスを付けないと正常に処理されない
  • int、long等は処理系によってサイズが変わるが、32bit以下の定数はサフィックス不要、32bitを超える場合はサフィックスが必要
  • 処理系に依存せず一定サイズの変数を宣言する場合はint32_t、int64_tを使用するが、定数の場合はサフィックスを使用することで処理が保証される

質問者が選んだベストアンサー

  • ベストアンサー
  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.3

int32_t, int64_tの型が使えるのでしたら INT32_C(n), INT64_C(n)などが使えるはずです。

A-MASAK
質問者

お礼

ご回答ありがとう御座います。 >INT32_C(n), INT64_C(n) 上記の存在は知りませんでした、大変役に立ちました。

その他の回答 (3)

  • colder
  • ベストアンサー率43% (30/69)
回答No.4

>long longが32bitの場合 そんな場合無いから、long longは最低でも64bitあることが保証されています。

A-MASAK
質問者

お礼

ご回答ありがとう御座います。 あるサイトに long longのサイズは概ね64ビット以上の処理系依存のサイズを持つが C言語の仕様上はchar ≦ short ≦ int ≦ long ≦ long long とだけ定義されていていると記載されていた為、long longが64bit未満の場合もあるのではと思ったのですが、No.2の回答のように64bitが扱えない訳ですからlong longの件は無意味な質問でした。

  • Gotthold
  • ベストアンサー率47% (396/832)
回答No.2

> 言語で定数を扱う際に一定以上のサイズの定数の場合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)
回答No.1

intで定義した変数はそのまま(int)書く。 longで定義したものはLを必ず書く。 int i = 1; long j= 2L; Lについては小文字で書くとlとなり、1と間違うのでLと書いてください。

A-MASAK
質問者

お礼

お礼が遅くなり申し訳ありません。 基本的にはint(int変数に代入する定数)の場合はサフィックス無しでOK、long(long変数に代入する定数)の場合はサフィクスLが必要な事は把握しています。 質問をさせて頂いた経緯は処理系に依存するintやlongでの変数宣言はしたくなかったのでint32_t、int64_t等を使いたいのですが、もし処理系のintサイズが16bitの場合はint32_tで宣言した変数にもサフィクスが必要なのかを確認したかったという物です。

関連するQ&A

専門家に質問してみよう