C без знака int с отрицательным значением? - PullRequest
5 голосов
/ 02 декабря 2009

У меня есть целое число без знака, но когда я его распечатываю с использованием% d, иногда там есть отрицательное значение?

Ответы [ 3 ]

26 голосов
/ 02 декабря 2009

Печать %d будет читать целое число как десятичное число со знаком, независимо от его определенного типа.

Для печати чисел без знака используйте %u.

Это происходит из-за способа C обрабатывать переменные аргументы. Компилятор просто извлекает значения из стека (набираемые как void* и указывающие на стек вызовов), а printf должен выяснить, какие данные содержатся в строке формата, которую вы им передаете.

Вот почему вам нужно предоставить строку формата - C не может RTTI или «базовым классом» (например, Object в Java) для получения универсального или предопределенного toString с.

10 голосов
/ 02 декабря 2009

Это должно работать:

unsigned int a;
printf("%u\n", a);

Объяснение: На большинстве архитектур целые числа со знаком представлены в дополнении до двух . В этой системе положительные числа меньше 2**(N-1) (где N = sizeof(int)) представлены одинаково независимо от того, используете ли вы int или unsigned int. Однако, если число в вашем целом без знака больше, чем 2**(N-1), оно представляет отрицательное число со знаком под дополнением к двум - это то, что printf дал вам, когда вы его передали "%d".

4 голосов
/ 02 декабря 2009

% d означает, что printf будет интерпретировать значение как int (которое подписано). используйте% u, если это целое число без знака.

...