В C, как добраться, вычисляют отрицание неподписанного количества

Я обычно кодирую двоичные данные MIME Base64 или URL, кодирующий .

6
задан Eric Leschinski 23 July 2013 в 20:20
поделиться

6 ответов

Очевидно, вы пропустили слово без знака в цитированном вами описании. Это ключевое слово в данном случае. В языке C «отрицательное» беззнаковое количество по-прежнему остается беззнаковым, что означает, что оно не является отрицательным на самом деле. Беззнаковые значения не могут быть отрицательными по определению. Они всегда положительны или равны 0. Арифметика беззнаковых значений в C выполняется по модулю арифметики, или, проще говоря, беззнаковые величины "оборачиваются", когда вы выполняете с ними арифметические операции. Унарное отрицание - не исключение. Вычисление -n , когда n беззнаковое, ничем не отличается от вычисления 0 - n .

7
ответ дан 8 December 2019 в 02:52
поделиться

Беззнаковые значения не могут быть отрицательными, поэтому -200 не является возможным результатом.

Здесь говорится, что if UINT_MAX равно 65535 в вашей системе, то результат:

unsigned a = 200;
unsigned b = -a;
long c = -a;

оставит 65336 в обоих b и c .

Если ваша система имеет UINT_MAX> LONG_MAX (обычно потому, что int и long имеют одинаковый размер), вам нужно будет использовать long long для c (хотя обратите внимание, что есть даже нет никаких гарантий, что этого достаточно.)

Эта деталь (что результатом отрицания числа без знака является другое, обязательно положительное число без знака) может привести к некоторым неожиданным эффектам, если вы его не понимаете. Например,

8
ответ дан 8 December 2019 в 02:52
поделиться

Он описывает операции для реализации модульной арифметики , то есть вычисляет такое значение, что

a + (-a) == 0

Это приводит к тому, что отрицательное число без знака ведет себя так же, как отрицательное число со знаком.

На машинах, где числовое представление представляет собой дополнение до двух (например, x86), это делается путем простой обработки битовой комбинации беззнакового числа как обычного числа со знаком и использования стандартной машинной инструкции «отрицания». .

6
ответ дан 8 December 2019 в 02:52
поделиться

Другой вопрос уже затронул эту тему

Пример

unsigned char i = -10;
printf("%u\n",i);

Результат

246
4
ответ дан 8 December 2019 в 02:52
поделиться

Операции с целыми типами без знака используют модульную арифметику. Арифметика по модулю m почти такая же, как и обычная арифметика, за исключением того, что результатом является положительный остаток при делении на m, если вы не сталкивались с ним в школе (подробнее см. статью в Википедии . Например, 7-3 по модулю 10 равно 4, а 3-7 по модулю 10 равно 6, так как 3-7 равно -4, и деление его на 10 дает частное -1 и остаток от 6 (это также может быть выражено с частным 0 и остатком -4, но это не так, как это работает в модульной арифметике). Возможные целые значения по модулю m - это целые числа от 0 до m-1 включительно. Отрицательные значения невозможны, и -200 не является допустимым беззнаковым значением ни при каких обстоятельствах.

Теперь унарный минус означает отрицательное число, которое не равно " ta допустимое значение по модулю m. В этом случае мы знаем, что оно находится между 0 и m-1, потому что мы начинаем с целого числа без знака. Следовательно, мы смотрим на деление -k на m. Так как одно возможное значение является частным от 0 и остатком от -k, другое возможное - это частное от -1 и остатка от mk, поэтому правильный ответ - mk.

Целые числа без знака в C обычно описываются максимальным значением , а не модуль, что означает, что 16-битное число без знака обычно описывается как от 0 до 65535 или как имеющее максимальное значение 65535. Это описание значений путем указания m-1, а не m.

Что цитата, которая у вас есть, говорит, что значение отрицательного числа берется путем вычитания его из m-1 и последующего добавления 1, поэтому -k равно m - 1 - k + 1, то есть m - k. Описание немного окольное,

4
ответ дан 8 December 2019 в 02:52
поделиться

Давайте просто и посмотрим at unsigned char ... 8 бит с диапазоном значений от 0 до 255.

Что такое (unsigned char) -10 и как он рассчитывается?

Исходя из приведенного вами утверждения K&R, мы имеем :

повышенное значение -10 равно 10 вычитается из наибольшее значение продвигаемого типа 255 плюс 1 = 246

поэтому (unsigned char) -10 на самом деле 246. Имеет ли это смысл?

3
ответ дан 8 December 2019 в 02:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: