Я не понимаю что-то при объединении подписанных и неподписанных чисел в c. Почему выражение 0u - 1
, дайте мне максимальное значение (в зависимости от размера слова) целых чисел без знака. ??модульное дополнение для беззнакового числа в c
ответ
Согласно стандарту 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
let работать с 8bits, i hardt, что -1 сначала преобразуется в unsigned 0xFF (1111 1111), а затем мы делаем добавление 0 + 0xFF ?? это не так, как это работает? – karim
@karim В вашем выражении есть двоичный оператор минус. Это не то же самое, что унарный минус. Таким образом, нет такого операнда, как -1. –
Когда вы арифметику с обоими знаковых и беззнаковых чисел, подписанная число преобразуется в число без знака. Это заканчивается (0 - 1) без знака, который является наибольшим возможным беззнаковым числом. – malisper
@malisper 'signed' и' unsigned' версии того же типа следуют этому правилу. Если «длинный» или «короткий» бросается в микс, все снова запутывается. – Potatoswatter