6

我正在查看C++ Integer Overflow 和 Promotion,试图复制它,最后得到了这个:

#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阅读了上面提到的帖子后,我的预期是这样的,第二个也是如此printf:两者都打印 4294967291。printf但是,第一个打印 -5。现在,我的猜测是,这printf只是将 4294967291 的无符号值解释为有符号值,以 -5 结尾(这适合看到 4294967291 的 2 补码是 11...11011),但我不是 100 % 确信我没有忽略任何事情。那么,我是对的还是这里发生了其他事情?

4

1 回答 1

4

是的,你没看错。这就是为什么printf()通常是不安全的:它严格根据格式字符串解释其参数,忽略它们的实际类型。

于 2013-03-26T16:07:36.030 回答