この単純なCプログラムが印刷されるのはなぜ-2147483648
ですか?
#include <stdio.h>
int main(){
printf("%i", (int)2147483648);
return 0;
}
もちろん、キャストせず%lld
にフォーマット指定子として使用すると、期待どおりの出力が得られます。
int
2147483647は、プラットフォーム上のの最大値です。
2147483648 == 0x80000000は-2147483648と同じバイナリ表現を持っているため、その結果が得られました。
整数をより小さな符号付き型に変換する場合、値を新しい型で表すことができない場合の動作は実装によって定義されます。
6.3.1.3
整数型の値を_Bool以外の整数型に変換する場合、その値を新しい型で表すことができれば、変更はありません。
[...]
それ以外の場合、新しいタイプは署名され、値を表すことができません。結果が実装定義であるか、実装定義のシグナルが発生します。
にキャストすると、int
(少なくとも現在のプラットフォームでは)32ビットの符号付き数値にキャストされます。そのスペースに格納できる最大の正の値は2147483647です。1を加算すると、出力である最大の負の値にロールオーバーします。
を使用する場合long long int
、最小幅は64ビットだと思います。そのスペースに値2147483648を簡単に保持できるため、出力は期待どおりになります。
32ビット2の補数システムでint
は、通常、最大値は次のとおりです。
2147483647
それで
2147483648
はlong
値です。
値が符号付き型に収まらない場合の値の符号付き型への変換は、実装によって定義されます。