Вопрос

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

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

Заранее благодарю

Это было полезно?

Решение

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

Пример: Nibble (- 2) = 1110 = > Байт (-2) = 1111_1110

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

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top