Я понимаю, что присваиваю подписанное значение int больше, чем оно может обрабатывать. Также я должен использовать %d
для подписанных и %u
для неподписанных. Точно так же я не должен присваивать значение -ve
без знака. Но если я выполняю такие задания и использую printf, как показано ниже, я получаю результаты, показанные ниже.Неподписанные и подписанные int и printf
Мое понимание состоит в том, что в каждом случае число преобразованных двоичных представлений его двоих представляет собой то же самое для -1
или 4294967295
. Вот почему %u
для подписанных отпечатков 4294967295
путем игнорирования -ve
левый бит. При использовании% d для подписанного int он использует самый левый бит как флаг -ve
и печатает -1
. Аналогично %u
для неподписанных принтов без знака, но %d
заставляет обрабатывать номер как подписанный и, таким образом, печатает -1
. Это верно?
signed int si = 4294967295;
unsigned int ui = 4294967295;
printf("si = u=%u d=%d\n", si, si);
printf("ui = u=%u d=%d\n", ui, ui);
Выход:
si = u=4294967295 d=-1
ui = u=4294967295 d=-1
signed int si = -1;
unsigned int ui = -1;
printf("si = u=%u d=%d\n", si, si);
printf("ui = u=%u d=%d\n", ui, ui);
Выход:
si = u=4294967295 d=-1
ui = u=4294967295 d=-1
Обратите внимание, что мой ответ на этот вопрос объясняет, что [-1, преобразованный в unsigned всегда будет максимальным значением без знака для этого типа] (http://stackoverflow.com/q/22801069/1708801) ... поэтому присваивание ' 1' к значению без знака - это всегда корректное поведение. –
Но просто повторная интерпретация отрицательного интегрального значения как интегрального значения 'unsigned 'не определена.Точно так же, как переинтерпретация слишком большого «неподписанного» интегрального значения как интегрального значения 'signed' не является. – Deduplicator
Вы можете найти «std :: numeric_limits» полезным. Переход от uin32_t к uint64_t гораздо читабельнее. std :: numeric_limits :: max(), становится std :: numeric_limits :: max() и т. д. –