2009-02-07 2 views
4

Я читаю второе издание книги K & R, и одно из упражнений требует печати всех максимальных целых значений, определенных в заголовке limits.h. Тем не менее, это ...Почему printf() выводит -1 для больших целых чисел?

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

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

unsigned int: 0 to -1 

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

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

+0

Как в стороне, ваш компилятор должен быть в состоянии предупредить вас об этой ошибке. Если это не так, посмотрите, можете ли вы включить дополнительные предупреждения или подумать об использовании другого компилятора. –

ответ

15

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

Update:
Если вы используете «% U» в качестве строки формата вы получите ожидаемый результат.

+0

«% u» отлично работает. Мне просто интересно, почему ребята из K & R не упоминали «% u» нигде в своей книге ... Вопрос не возник бы, если бы они это сделали. – Ree

+0

Я предполагаю, что это ошибка в книге, потому что текст в инструкции printf предполагает, что автор хотел показать свойства unsigned int, что на самом деле он этого не делает. – newgre

+1

Конечно, K & R упоминает «% u» в своей книге (стр. 154 - один пример). Мы говорим о K & R здесь. – volni

9

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

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

Смежные вопросы