【发布时间】: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