Извлечение битового поля из числа со знаком - PullRequest
1 голос
/ 03 ноября 2008

У меня есть числа со знаком (дополнение 2s), хранящиеся в 32-разрядных целых числах, и я хочу извлечь из них 16-разрядные поля. Правда ли, что если я извлечу младшие 16 бит из 32-битного числа со знаком, результат будет правильным, если исходное (32-битное) число уместится в 16 бит?

Для положительных чисел это тривиально, и, похоже, и для отрицательных. Но можно ли это доказать?

Заранее спасибо

Ответы [ 2 ]

3 голосов
/ 03 ноября 2008

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

Пример: Nibble(-2) = 1110 => Byte(-2) = 1111_1110

Очевидно, что также верно и обратное, если вы захватите хотя бы один знаковый бит, то значение числа останется неизменным.

0 голосов
/ 03 ноября 2008

Из моего (второго) прочтения вашего вопроса кажется, что вам не нужно «извлекать» какие-либо биты, а вместо этого конвертировать целое число?

т.е. сделать что-то вроде этого:

int negative = -4711;
short x = (short) negative;

В этом случае компилятор позаботится о том, чтобы как можно больше точности исходного числа было преобразовано в присваивании. Это будет иметь место, даже если базовое оборудование не будет использовать дополнение 2: s. Если это так, то, скорее всего, это будет усечение, как объяснил Мотти.

...