Вы должны помнить, что в основном вы работаете с битами. Таким образом, вы можете присвоить значение -4 целому числу без знака, и это поместит серию битов в эту область памяти. Эти биты могут быть интерпретированы как -4 при определенных обстоятельствах . Одним из таких обстоятельств является очевидное: вы сказали компилятору / системе, что биты в этой ячейке памяти должны интерпретироваться как число с комплиментом в виде двоих. Поэтому, если вы выполните printf ("% s", i) prtinf выполняет свою магию и преобразует число комплиментов двух в величину и знак. Величина будет 4, а знак будет отрицательным, поэтому он отображает «-4».
Однако, если вы сообщаете компилятору, что данные в этой ячейке памяти не подписаны, то биты не меняются , а вместо их интерпретация изменяется. Поэтому, когда вы делаете свое добавление, сохраняйте результат в целочисленной ячейке памяти без знака, а затем вызывайте printf для результата, чтобы не беспокоиться о поиске знака, потому что по определению он всегда положительный. Он рассчитывает величину и печатает ее. Величина будет отключена, потому что информация о знаке все еще закодирована в битах, но она рассматривается как информация о величине.