リテラル式にも型がありますか?C++リテラル整数型
long long int a = 2147483647+1 ;
long long int b = 2147483648+1 ;
std::cout << a << ',' << b ; // -2147483648,2147483649
リテラル式にも型がありますか?C++リテラル整数型
long long int a = 2147483647+1 ;
long long int b = 2147483648+1 ;
std::cout << a << ',' << b ; // -2147483648,2147483649
はい、リテラル数字には型があります。接尾辞のない10進整数リテラルのタイプは、int
,long
,long long
の最初の整数で、整数を表すことができます。 2進数、16進数、8進数のリテラルのタイプも同様に選択されますが、リスト内の符号なしのタイプも選択されます。
符号なしタイプを使用するには、接尾辞U
を使用します。接尾辞にL
を1つ使用すると、タイプは少なくともlong
になりますが、long
として表すことができない場合はlong long
となる可能性があります。 LL
を使用する場合は、タイプはlong long
である必要があります。
結果であることint
は32ビットタイプでありlong
は、64ビットであり、次いで2147483647
はlong
をint
2147483648
ながら入力している型を持つ場合。つまり、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
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に関する詳細な情報を見つけることができます。
2147483647の型は 'int'でも構いませんが、long型でもかまいません。さらに、2147483647 + 1は整数オーバーフローの可能性があります。これは-2147483648ではなく、未定義の動作です。最後に、2147483647L + 1もオーバーフローする可能性があります(Microsoftコンパイラにも適用されます)。 –
@MartinBonner私はWindowsで64ビットであるlong longを使用するように私の答えを変更しました。 C++標準による未定義の動作ですが、ほとんどの場合、2の補数オーバーフローとして実装されており、これはOPが認識した動作です。 – m7913d
@MartinBonner riciの答えによると、int(32ビットであると仮定した場合) – m7913d
を生成します。 –
これをチェックすると、すべての疑問が解消されます: http://stackoverflow.com/questions/1819189/what-range-of-values-can-integer-types-store-in-c – divyum
私は見ません長文についての質問は、「リテラル式には型もありますか?」という質問にどのように関連していますか? –