整数提升、有符号/无符号和printf

7

我正在研究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和第二个printf的输出符合我的预期,它们都打印出了4294967291。然而,第一个printf打印出了-5。现在,我猜想这是因为printf将4294967291的无符号值解释为有符号值,得到了-5(这应该是正确的,因为4294967291的二进制补码为11...11011),但我并不百分之百地确定我没有忽略任何问题。所以,我的猜测对吗?还是其他问题?


1
这只是未定义行为(UB)。向 printf 传递错误的类型会引发未定义行为。 - R.. GitHub STOP HELPING ICE
@R..:是的,我明白了,但我想确保我没有漏掉其他什么东西。 - rainer
1个回答

4

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接