2013-07-14 1 views
-8

unsigned int - это то же самое, что uint32_t? который составляет 32 бита без знака целых чисел, а не 2 комплимента?unsigned int T = 0xFFFFFFFF равно -1 в C ?? он не должен работать как 2 комплимента сразу после unsigned?

uint32_t y = 0xFFFFFFFF; // gives -1 i dont get why is it negative? 
uint8_t x = 0b11111111; // gives 255 i understand this 
+1

Что вы подразумеваете под "дает -1"? Можете ли вы добавить код, который показывает это на ваш вопрос? – simonc

+1

И как вы его распечатываете? – Mysticial

+1

'uint32_t y = 0xFFFFFFFF;' совпадает с 'uint32_t y = -1;', но это положительное значение ('2^32 - 1'). Как вы напечатали его, чтобы получить выход '-1'? –

ответ

7

Бита модель вы показываете представляет -1 для целого числа, и максимального значения, если оно представляющее собой целое число без знака.

Когда вы говорите, что это «дает -1», вы должны посмотреть, как вы это проверяете. Если, например, вы печатаете его с помощью printf, вы должны обязательно использовать спецификатор формата без знака.

-1

uint32_t y = 0xFFFFFFFF; // дает -1, я не понимаю, почему это отрицательно?

Причина, по которой это отрицательная причина, потому что, по определению, любое число, в котором установлен старший битовый бит, должно интерпретироваться как отрицательное, когда используется подписанный тип. В вашем случае значение обычно не считается отрицательным, так как uint считается неподписанным.

Следовательно, это означает, что, например:

0xFFFF равен -1, когда рассматривается как 16bit целое число, но такое же значение не является отрицательным при использовании 32 разрядное целого числа.

Компилятор расширяет подпись, если используются соответствующие преобразования. Таким образом, приведенное выше значение все равно станет равным -1, если его соответствующим образом повысить до 32-битного int.

+0

-1 не отрицательный. OP, вероятно, вызывал UB, пытаясь напечатать его с помощью 'printf ("% d ", ...)'. –

Смежные вопросы