Почему printf () выводит -1 для больших целых чисел? - PullRequest
4 голосов
/ 08 февраля 2009

Я читаю второе издание книги K & R, и одно из упражнений требует печати всех максимальных целочисленных значений, определенных в заголовке limit.h. Однако это ...

printf("unsigned int: 0 to %d\n", UINT_MAX);

... выводит следующее:

unsigned int: 0 to -1

Как я могу получить -1? Кто-нибудь может объяснить это поведение?

Я использую компилятор Digital Mars C в Vista.

Ответы [ 2 ]

15 голосов
/ 08 февраля 2009

Это потому, что UINT_MAX преобразуется в -1, если рассматривается как целое число со знаком. Причина этого заключается в том, что целые числа представлены в two's -plement . Как следствие, -1 и 4294967296 (т. Е. UINT_MAX) имеют одинаковое представление битов (0xFFFFFFFF, т. Е. Все биты установлены), и поэтому здесь вы получаете -1.

Обновление:
Если вы используете «% u» в качестве строки формата, вы получите ожидаемый результат.

9 голосов
/ 08 февраля 2009

В printf я полагаю, что% d является десятичным целым числом со знаком, вместо этого попробуйте% u.

Максимальное значение беззнакового целого имеет самый старший установленный бит (это все 1 с). В случае со знаком int наиболее значащий бит указывает отрицательные числа, поэтому при печати целого без знака как со знаком int printf считает его отрицательным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...