2013-03-26 4 views
5

Я просматривал C++ Integer Overflow and Promotion, пытался повторить его, и, наконец, в конечном итоге с этим:продвижение Integer, подписанная/без знака, и 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, просто интерпретируя значение unsigned в 4294967291 как знаковое значение, в результате получилось -5 (что соответствовало бы тому, что дополнение 2 в 4294967291 равно 11 ... 11011), но я не 100% убеждены, что я ничего не пропустил. Итак, я прав или что-то еще происходит здесь?

+1

Это просто UB. Передача неправильного типа 'printf' вызывает UB. –

+0

@R ..: Да, я подумал об этом, но я хотел убедиться, что мне не хватает чего-то другого. – rainer

ответ

4

Да, вы поняли это правильно. Вот почему printf(), как правило, небезопасен: он интерпретирует свои аргументы строго в соответствии со строкой формата, игнорируя их фактический тип.