2013-03-26 76 views
5

我一直在尋找通過C++ Integer Overflow and Promotion,試圖複製它,終於結束了這一點:整數推廣,符號/無符號,和printf

#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

這簡直就是UB。將錯誤的類型傳遞給'printf'調用UB。 – 2013-03-26 16:21:37

+0

@ R:是的,我想到了,但我想確保我沒有錯過別的東西。 – rainer 2013-03-26 16:22:34

回答

4

是的,你說得對。這就是爲什麼printf()通常是不安全的:它嚴格根據格式字符串解釋其參數,忽略它們的實際類型。