整数提升,签名/未签名和printf

时间:2013-03-26 16:06:18

标签: c++ c language-lawyer integer-promotion

我正在浏览C++ Integer Overflow and 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(这适合看到2的补码4294967291是11 ... 11011),但是我并不是100%确信我没有忽视任何事情。那么,我是对的还是其他事情发生在这里?

1 个答案:

答案 0 :(得分:4)

是的,你做得对。这就是printf()通常不安全的原因:它严格根据格式字符串解释其参数,忽略它们的实际类型。