6

私はC++整数のオーバーフローとプロモーションを調べていて、それを複製しようとしましたが、最終的には次のようになりました。

#include <iostream>
#include <stdio.h>

using namespace std;

int main() {
    int i = -15;
    unsigned int j = 10; 
    cout << i+j << endl; // 4294967291
    printf("%d\n", i+j); // -5 (!)
    printf("%u\n", i+j); // 4294967291

    return 0;
}

上記coutの投稿を読んだ後、私が期待したことを実行します。2番目の投稿も同様printfです。どちらも4294967291を印刷printfします。ただし、最初の投稿は-5を印刷します。さて、これはprintf単に4294967291の符号なしの値を符号付きの値として解釈し、最終的に-5になると思います(4294967291の2の補数が11 ... 11011であることがわかります)が、私は100ではありません%私は何も見逃していないと確信しました。それで、私は正しいですか、それともここで何か他のことが起こっていますか?

4

1 に答える 1

4

はい、正解です。そのためprintf()、一般的に安全ではありません。引数は、実際の型を無視して、フォーマット文字列に従って厳密に解釈されます。

于 2013-03-26T16:07:36.030 に答える