Когда я пытаюсь напечатать «UINT_MAX», я получаю -1, почему это? Это единственное, что у меня есть в моей main () - инструкции printf, которая выводит UINT_MAX.
При попытке распечатать UINT_MAX я получаю -1
Ответы (2)
Вы использовали код формата %d
, который интерпретирует свой аргумент как знак int
. Вы используете систему с дополнением до двух, поэтому UINT_MAX
(0xFFFFFFFF
), интерпретируемый как знак int
, равен -1
. Если вы хотите распечатать его как unsigned
, используйте %u
.
"%d"
или "%u"
для int
или unsigned
является указанным исключением, если значение может быть представлено в обоих типах. иначе его UB использовать несовпадающий спецификатор / тип.
- person chux - Reinstate Monica; 07.12.2016
printf
фактически не имеет такого исключения, когда значение может быть представлено в обоих типах. Возможно, вы думаете о va_arg
.
- person R.. GitHub STOP HELPING ICE; 07.12.2016
"%d"
или "%u"
для int
или unsigned
.
- person chux - Reinstate Monica; 07.12.2016
printf
.
- person R.. GitHub STOP HELPING ICE; 07.12.2016
printf()
. Тем не менее, я сомневаюсь, что мы здесь согласны по этому поводу - раздел достаточно открыт для интерпретации, учитывая его сложность. Возможно, вопрос для SO, если он еще не был полностью готов.
- person chux - Reinstate Monica; 07.12.2016
printf
не определяется в терминах va_arg
.
- 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
Как видите, первый бит используется как знаковый бит.
Попробуйте воспользоваться этим сайтом