我正在浏览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%确信我没有忽视任何事情。那么,我是对的还是其他事情发生在这里?
答案 0 :(得分:4)
是的,你做得对。这就是printf()
通常不安全的原因:它严格根据格式字符串解释其参数,忽略它们的实际类型。