Целочисленное продвижение, подписано / не подписано, и printf

Я просматривал C ++ Целочисленное переполнение и продвижение, попытался повторить это, и, наконец, в конечном итоге это:

#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: оба print 4294967291. Первый printfОднако отпечатков -5. Теперь я думаю, что это printf просто интерпретируя беззнаковое значение 4294967291 как значение со знаком, заканчивающееся на -5 (что было бы уместно, если бы допустить, что дополнение 2 к 4294967291 равно 11 … 11011), но я не уверен на 100%, что я ничего не пропустил , Так я прав или здесь что-то еще происходит?

5

Решение

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

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]