При попытке распечатать UINT_MAX я получаю -1

Когда я пытаюсь напечатать «UINT_MAX», я получаю -1, почему это? Это единственное, что у меня есть в моей main () - инструкции printf, которая выводит UINT_MAX.


person Jordan Baron    schedule 07.12.2016    source источник
comment
Покажите свой код (желательно MCVE).   -  person M.M    schedule 07.12.2016


Ответы (2)


Вы использовали код формата %d, который интерпретирует свой аргумент как знак int. Вы используете систему с дополнением до двух, поэтому UINT_MAX (0xFFFFFFFF), интерпретируемый как знак int, равен -1. Если вы хотите распечатать его как unsigned, используйте %u.

person ShadowRanger    schedule 07.12.2016
comment
Это не интерпретируется как подписанное int. Это просто неопределенное поведение. Спецификаторы формата должны соответствовать типу, который вы пытаетесь напечатать. - person R.. GitHub STOP HELPING ICE; 07.12.2016
comment
Спецификаторы формата @R .. должны соответствовать типу повышенного, а использование "%d" или "%u" для int или unsigned является указанным исключением, если значение может быть представлено в обоих типах. иначе его UB использовать несовпадающий спецификатор / тип. - person chux - Reinstate Monica; 07.12.2016
comment
@chux: printf фактически не имеет такого исключения, когда значение может быть представлено в обоих типах. Возможно, вы думаете о va_arg. - person R.. GitHub STOP HELPING ICE; 07.12.2016
comment
@R .. Я думаю о C11 §6.5.2.2 6 ..., поведение не определено, за исключением следующих случаев: - один продвинутый тип - это целочисленный тип со знаком, другой продвинутый тип - соответствующий беззнаковый целочисленный тип , и значение может быть представлено в обоих типах; .... разрешить использование "%d" или "%u" для int или unsigned. - person chux - Reinstate Monica; 07.12.2016
comment
@chux: Этот текст касается отсутствующих прототипов и не имеет ничего общего с printf. - person R.. GitHub STOP HELPING ICE; 07.12.2016
comment
@R .. Более крупный раздел определяет ... Если функция определена с типом, который включает прототип, и либо прототип заканчивается многоточием (, ...), что, безусловно, является printf(). Тем не менее, я сомневаюсь, что мы здесь согласны по этому поводу - раздел достаточно открыт для интерпретации, учитывая его сложность. Возможно, вопрос для SO, если он еще не был полностью готов. - person chux - Reinstate Monica; 07.12.2016
comment
@chux: Есть. stackoverflow.com/questions/4664100/ Обратите внимание, что я, кажется, по ошибке процитировал тот же отрывок, который вы только что сделали, в котором не указаны исключения для вариативного случая, а только для случая отсутствия прототипа. Вариативный регистр регулируется 7.16.1.1 Макрос va_arg, но printf не определяется в терминах va_arg. - person R.. GitHub STOP HELPING ICE; 07.12.2016
comment
@R .. прототип printf имеет ..., это не просто означает, что он использует va_arg? - person Stargateur; 07.12.2016
comment
@Stargateur: Нет; формально это просто часть языка. - person R.. GitHub STOP HELPING ICE; 07.12.2016

Вы можете распечатать его с помощью printf ()

printf("%u\n", UINT_MAX);

Вам необходимо использовать спецификатор u, man printf.

Почему вы получаете -1 со спецификатором d? Это из-за того, как работает целое число со знаком в памяти.

unsigned integer начинается с 0, в памяти это простая двоичная система.

десятичный => двоичный

  • 1 => 1
  • 2 => 10
  • 8 => 1000
  • 255 => 11111111

Целое число со знаком использует бит для интерпретации как отрицательное число, это сбивает с толку, потому что максимальное значение беззнакового int, когда оно интерпретируется как int, равно -1.

пример с 8-битным целым числом:

  • -1 => 11111111
  • -128 => 10000000
  • -9 => 11110111

Как видите, первый бит используется как знаковый бит.

Попробуйте воспользоваться этим сайтом

person Stargateur    schedule 07.12.2016