【问题标题】:Integer promotion, signed/unsigned, and printf整数提升、有符号/无符号和 printf
【发布时间】:2013-03-26 16:06:17
【问题描述】:

我浏览了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 结尾(这适合看到 4294967291 的 2 的补码是 11...11011),但我我不是 100% 相信我没有忽略任何事情。那么,我是对的还是这里发生了其他事情?

【问题讨论】:

  • 这简直就是 UB。将错误的类型传递给 printf 会调用 UB。
  • @R..:是的,我想到了,但我想确保我没有遗漏其他东西。

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2022-01-20
    • 2016-12-04
    • 2015-01-28
    • 2017-07-01
    • 1970-01-01
    • 2013-10-02
    • 2015-02-17
    • 1970-01-01
    相关资源
    最近更新 更多