-2

この単純なCプログラムが印刷されるのはなぜ-2147483648ですか?

#include <stdio.h>

int main(){
    printf("%i", (int)2147483648);
    return 0;
}

もちろん、キャストせず%lldにフォーマット指定子として使用すると、期待どおりの出力が得られます。

4

4 に答える 4

3

int2147483647は、プラットフォーム上のの最大値です。

2147483648 == 0x80000000は-2147483648と同じバイナリ表現を持っているため、その結果が得られました。

于 2012-08-28T12:31:40.437 に答える
2

整数をより小さな符号付き型に変換する場合、値を新しい型で表すことができない場合の動作は実装によって定義されます。

6.3.1.3

整数型の値を_Bool以外の整数型に変換する場合、その値を新しい型で表すことができれば、変更はありません。

[...]

それ以外の場合、新しいタイプは署名され、値を表すことができません。結果が実装定義であるか、実装定義のシグナルが発生します。

于 2012-08-28T12:30:25.627 に答える
0

にキャストすると、int(少なくとも現在のプラットフォームでは)32ビットの符号付き数値にキャストされます。そのスペースに格納できる最大の正の値は2147483647です。1を加算すると、出力である最大の負の値にロールオーバーします。

を使用する場合long long int、最小幅は64ビットだと思います。そのスペースに値2147483648を簡単に保持できるため、出力は期待どおりになります。

于 2012-08-28T12:31:30.620 に答える
0

32ビット2の補数システムでintは、通常、最大値は次のとおりです。

2147483647

それで

2147483648

long値です。

値が符号付き型に収まらない場合の値の符号付き型への変換は、実装によって定義されます。

于 2012-08-28T12:33:08.203 に答える