Печать %d
будет читать целое число как десятичное число со знаком, независимо от его определенного типа.
Для печати чисел без знака используйте %u
.
Это происходит из-за способа C обрабатывать переменные аргументы. Компилятор просто извлекает значения из стека (набираемые как void*
и указывающие на стек вызовов), а printf
должен выяснить, какие данные содержатся в строке формата, которую вы им передаете.
Вот почему вам нужно предоставить строку формата - C не может RTTI или «базовым классом» (например, Object
в Java) для получения универсального или предопределенного toString
с.