2014-09-05 1 views
0

Я не понимаю что-то при объединении подписанных и неподписанных чисел в c. Почему выражение 0u - 1, дайте мне максимальное значение (в зависимости от размера слова) целых чисел без знака. ??модульное дополнение для беззнакового числа в c

+1

Когда вы арифметику с обоими знаковых и беззнаковых чисел, подписанная число преобразуется в число без знака. Это заканчивается (0 - 1) без знака, который является наибольшим возможным беззнаковым числом. – malisper

+1

@malisper 'signed' и' unsigned' версии того же типа следуют этому правилу. Если «длинный» или «короткий» бросается в микс, все снова запутывается. – Potatoswatter

ответ

1

Согласно стандарту C

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

И в соответствии с обычным арифметического преобразованием

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

Unsigned int тип сохраняет значение объекта signed int.

В этом выражении

0u - 1; 

1 преобразуется в беззнаковый тип и выражение эквивалентно

0u - 1u 

Там используются без знака арифметических операций. Результат состоит из всех битов, установленных в 1, что эквивалентно максимальному значению без знака.

Операция выглядеть (для простоты я буду использовать только четыре бита)

0000 
- 
0001 
==== 

10000 <= borrowing one high-order bit to provide the operation 
- 
0001 
==== 
01111 
===== 
1111 
+0

let работать с 8bits, i hardt, что -1 сначала преобразуется в unsigned 0xFF (1111 1111), а затем мы делаем добавление 0 + 0xFF ?? это не так, как это работает? – karim

+0

@karim В вашем выражении есть двоичный оператор минус. Это не то же самое, что унарный минус. Таким образом, нет такого операнда, как -1. –