2013-03-26 6 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 है: दोनों प्रिंट 42 9 4 9 672 9 1। पहले printf, हालांकि, प्रिंट -5। अब, मेरा अनुमान है कि यह printf है जो हस्ताक्षर किए गए मान के रूप में 42 9 4 9 672 9 1 के हस्ताक्षरित मूल्य को आसानी से व्याख्या करता है, -5 के साथ समाप्त होता है (जो यह देखकर फिट होगा कि 42 9 4 9 672 9 1 का पूरक 2 11 ... 11011 है), लेकिन मैं नहीं हूं 100% आश्वस्त है कि मैंने कुछ भी नजरअंदाज नहीं किया है। तो, क्या मैं सही हूं या यहां कुछ और हो रहा है?

+1

यह बस यूबी है। गलत प्रकार को 'printf' में पास करने से यूबी को आमंत्रित किया जाता है। –

+0

@ आर ..: हाँ, मुझे लगा कि, लेकिन मैं यह सुनिश्चित करना चाहता था कि मुझे कुछ और याद नहीं आया। – rainer

उत्तर

4

हां, आपको यह सही मिला। यही कारण है कि printf() आम तौर पर असुरक्षित है: यह अपने वास्तविक प्रकार को अनदेखा करते हुए प्रारूप स्ट्रिंग के अनुसार सख्ती से अपने तर्कों का व्याख्या करता है।

संबंधित मुद्दे