Преобразование большого числа в целое без знака в C - PullRequest
4 голосов
/ 16 апреля 2009

Я прошел через k & r. У меня были проблемы с пониманием следующих строк на странице 197 (раздел A6)

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

Может ли любое тело объяснить это немного подробнее? Спасибо

Ответы [ 2 ]

6 голосов
/ 16 апреля 2009

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

Давайте возьмем это понемногу и обратно:

Какое наибольшее значение может быть представлено в беззнаковом типе шириной n битов?

2^(n) - 1.

Что еще больше, чем это значение?

2^n. 

Как происходит конвертация?

unsigned_val = signed_val % 2^n

Теперь, часть почему: стандарт не предписывает, какое битовое представление используется. Отсюда и жаргон. В представлении дополнения до двух, которое, безусловно, наиболее часто используется, это преобразование не изменяет битовую комбинацию (если, конечно, не существует усечения).

Подробнее см. В разделе «Интегральные преобразования из стандарта».

6 голосов
/ 16 апреля 2009

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

Например:

01111111 11111111 11110000 00001111

при преобразовании в 16 бит unsigned short будет:

11110000 00001111

Это эффективно математически выражается в:

target_value = value % (target_type_max+1)           ( % = modulus operator )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...