2016-04-20 3 views
0

У меня есть данные, записанные в short тип данных. Записанные данные имеют форму дополнения 2. Теперь, когда я пытаюсь распечатать данные с использованием% 04x, данные с MSB = 0 печатаются штрафом, например, если data = 740, печать я получаю 0740 Но когда MSB = 1, я не могу получить правильную печать , Например, если данные = 842, печать я получаю: fffff842 Я хочу, чтобы данные усекались до 4 байтов, поэтому ожидаемый результат - f842Как усечь вывод дополнений 2

ответ

0

Я предполагаю, что здесь есть C (или, возможно, C++).

Из аргументов по умолчанию поощрений задействованных при вызове функции с переменными аргументами (например, printf), ваше использование short приведет к продвижению целого, в котором говорится, что «Если INT может представлять все значения исходного типа (ограниченные шириной для битового поля ), значение преобразуется в значение int «.

A short преобразуется в int с помощью расшифровки знака, а знак 0xf842 с расширением до 32 бит равен 0xfffff842.

Вы можете использовать побитовое И чтобы замаскировать самое значительное слово:

printf("%04x", data & 0xffff); 

Можно также добавить h длины спецификатора указать, что вы хотите только печатать (без знака) short на сумму битов из int:

printf("%04hx", data); 
0

либо объявить данные как тип, который имеет длину 16 бита, или убедитесь, что функция печати использует правильный формат для значения 16 бита. Или используйте ваш текущий тип, но побитовое И с 0xffff. То, что вы можете сделать, зависит от того, на каком языке вы это делаете.

Но каким бы способом вы ни отправились, проверьте свои предположения снова. В вашем вопросе, по-видимому, есть несколько вопросов:

  • 2s-дополнение применяется только к подписанным номерам. В вашем вопросе нет отрицательных чисел.
  • Предполагая, что вы имеете в виду C's short - он не должен быть 16 бит в длину.
  • «Я получаю fffff842 Я хочу, чтобы данные усекались до 4 байтов» - fffff842 имеет длину 4 байта. f842 имеет длину 2 байта.
  • 2-байтовое значение 842 не имеет набора MSB.
Смежные вопросы