2017-03-19 15 views
2

リテラル式にも型がありますか?C++リテラル整数型

long long int a = 2147483647+1 ; 
long long int b = 2147483648+1 ; 
std::cout << a << ',' << b ; // -2147483648,2147483649 
+0

を生成します。 –

+0

これをチェックすると、すべての疑問が解消されます: http://stackoverflow.com/questions/1819189/what-range-of-values-can-integer-types-store-in-c – divyum

+1

私は見ません長文についての質問は、「リテラル式には型もありますか?」という質問にどのように関連していますか? –

答えて

6

はい、リテラル数字には型があります。接尾辞のない10進整数リテラルのタイプは、int,long,long longの最初の整数で、整数を表すことができます。 2進数、16進数、8進数のリテラルのタイプも同様に選択されますが、リスト内の符号なしのタイプも選択されます。

符号なしタイプを使用するには、接尾辞Uを使用します。接尾辞にLを1つ使用すると、タイプは少なくともlongになりますが、longとして表すことができない場合はlong longとなる可能性があります。 LLを使用する場合は、タイプはlong longである必要があります。

結果であることintは32ビットタイプでありlongは、64ビットであり、次いで2147483647longint2147483648ながら入力している型を持つ場合。つまり、2147483647+1はオーバーフローします(これは未定義の動作です)。2147483648+1は単純に2147483649Lです。

これは、C++標準の第2段落§ 2.3.12([lex.icon])で定義されており、上記の説明は、そのセクションの表7の要約です。

割り当ての宛先のタイプは、割り当ての右側の式の値に決して影響しないことを覚えておくことが重要です。計算をlong longの結果にする場合は、計算の引数を強制的にlong longにする必要があります。ただlong long変数に代入することは十分ではありません:ヨーヨーは、 `+ 1 'を最初に行い、その後、長い長いにキャストしているため

long long a = 2147483647 + 1LL; 
std::cout << a << '\n'; 

2147483648 

live on coliru

+0

最小整数型を使用する義務はありますか? – m7913d

+1

@ m7913d:標準は正確に「対応するリストの最初のもの」と言っています。引用を追加しました(これは表現できる最小の整数型ではありません。 – rici

+0

@rici: '' a''のようなリテラルcharは、 '' char''の型になります(Cとは異なり、 'int'と入力してください)。 – rodrigo

0
int a = INT_MAX ; 
long long int b = a + 1 ; // adds 1 to a and convert it then to long long ing 
long long int c = a; ++c; // convert a to long long int and increment the result with 1 
cout << a << std::endl; // 2147483647 
cout << b << std::endl; // -2147483648 
cout << c << std::endl; // 2147483648 
cout << 2147483647 + 1 << std::endl; // -2147483648 (by default integer literal is assumed to be int) 
cout << 2147483647LL + 1 << std::endl; // 2147483648 (force the the integer literal to be interpreted as a long long int) 

あなたは、整数リテラルhereに関する詳細な情報を見つけることができます。

+2

2147483647の型は 'int'でも構いませんが、long型でもかまいません。さらに、2147483647 + 1は整数オーバーフローの可能性があります。これは-2147483648ではなく、未定義の動作です。最後に、2147483647L + 1もオーバーフローする可能性があります(Microsoftコンパイラにも適用されます)。 –

+0

@MartinBonner私はWindowsで64ビットであるlong longを使用するように私の答えを変更しました。 C++標準による未定義の動作ですが、ほとんどの場合、2の補数オーバーフローとして実装されており、これはOPが認識した動作です。 – m7913d

+0

@MartinBonner riciの答えによると、int(32ビットであると仮定した場合) – m7913d