デフォルトではint型ではない整数型の型?

私はちょうどforループの100億がそれほど長くかかる(なぜOPが実際に中止されたのか)を質問したこの質問に答えましたそれは10分後に反復するよりも10分後です)

for (i = 0; i < 10000000000; i++)

今私と他の多くの明白な答えは、反復変数が32ビット(決して100億に達する)であり、ループが無限ループになっているためです。

しかし、私はこの問題を認識しましたが、コンパイラ内部で実際に何が起こっているのか疑問です。

リテラルには L が付加されていないので、IMHOは int
型である必要があります。オーバーフローのため、到達可能な範囲内の通常の int でなければなりません。実際に
int
から到達できないことを実際に認識するためには、コンパイラは100億であることを知る必要があるため、それを32ビット以上の定数と見なします。

このようなリテラルは、 L
が付加されていなくても、この標準的な振る舞いであっても、自動的に適合する(または少なくとも実装で定義された)範囲(この場合は少なくとも64ビット)に昇格しますか?または、UBのように、オーバーフロー(実際にはUBの整数オーバーフロー)のために、シーンの裏側で何か違うものがありますか?スタンダードから引用したものは、あればいいかもしれません。

元の質問はCでしたが、私はC ++の回答もありがとうございます。

ベストアンサー

C ++に関する限り:

C ++ 11、[lex.icon]¶2

整数リテラルの型は、その値が表現できる表6の対応するリストの最初のものです。

接尾辞と10進定数を持たないリテラルについては、表6を参照してください。

int
long int
long long int

(興味深いことに、16進定数または8進定数についても、 unsigned
型も許されますが、それぞれが対応する署名済みの

したがって、その場合、定数は long int (または long int
)が32ビット)。

「大きすぎるリテラル」はコンパイルエラーになるはずです。

翻訳単位の1つに、許可された型で表現できない整数リテラルが含まれていると、プログラムが不正です。

(ibidem、¶3)

このサンプルでは即座にこのサンプルに表示されており、ideone.comは32ビットコンパイラを使用していることがわかります。


私は今質問がCに関するものであることを見ました…まあ、多かれ少なかれ同じです:

C99、§6.4.4.1

整数定数の型は、その値を表現できる対応するリストの最初のものです。

リストはC ++標準と同じです。


Addendum: both C99 and C++11 allow also the literals to be of
“extended integer types” (i.e. other implementation-specific
integer types) if everything else fails. (C++11, [lex.icon] ¶3;
C99、§6.4.4.1 ¶5 after the table)

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です