C Unsigned int дает отрицательное значение?

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

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

Для печати неподписанных номеров используйте %u .

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

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

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

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

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

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