Я просматривал 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% убеждены, что я ничего не пропустил. Итак, я прав или что-то еще происходит здесь?
Это просто UB. Передача неправильного типа 'printf' вызывает UB. –
@R ..: Да, я подумал об этом, но я хотел убедиться, что мне не хватает чего-то другого. – rainer