Я просматривал 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%, что я ничего не пропустил , Так я прав или здесь что-то еще происходит?
Да, вы правильно поняли. Вот почему printf()
как правило, небезопасно: он интерпретирует свои аргументы строго в соответствии со строкой формата, игнорируя их фактический тип.
Других решений пока нет …