8-байтовое значение со знаком до 4-байтового значения (длинное) - PullRequest
1 голос
/ 09 декабря 2010

Я получаю значение со знаком, имеющее 8 байтов, в байтовый буфер [8]. Этот знаковый бит является битом 63 для всех значений.

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

Как я могу перепечатать это значение для стандартного длинного знака (4 байта)?

Знак в бите 63, поэтому

signed char my_sign = buffer[7] & 0x80 ? -1 : 0

дай мне знак (буфер [0] & 0x80? -1: 0 для другого индейца: -)

Значение чем

signed long my_value = my_sign ? -*(long *)buffer : *(long *)buffer

Есть ли более простой способ?

Ответы [ 3 ]

2 голосов
/ 09 декабря 2010

Какое представление используется для отрицательных чисел в вашем 8-байтовом значении?Если он использовал 2-комплемент, то вы можете положиться на тот факт, что значения 2-комплемента могут быть безопасно усечены до любой длины без каких-либо дополнительных шагов.Исходное значение сохраняется до тех пор, пока вы не усекаете «занятые» позиции.

Т.е. положительное 8-байтовое значение будет иметь все нули в старших «неиспользуемых» байтах, а отрицательное значение будет иметь все единицы.в старших «неиспользованных» байтах.В зависимости от порядка следования байтов, возможно, вам ничего не нужно делать: просто возьмите младшие 4 байта, и все готово.

Итак, опять же, какое представление используется для отрицательных чисел?Вы сказали, что старшие байты содержат нули.Должны ли мы предполагать, что они содержат нули даже для отрицательных чисел?Если это так, то используемое представление не является 2-х дополнением.

2 голосов
/ 09 декабря 2010

Предполагая, что используется байтовый код и что вам нужен только знак, т. Е. Ваш вывод равен -1 или 0:

long my_value = buffer[1] & 0x80 ? -1 : 0

Я чувствую потребность в графике ASCII, чтобы улучшить понимание вышеизложенного. Вот как я предположил, что биты пронумерованы внутри buffer:

6666555555555544<b>4</b>44444443333333333222222222211111111110000000000 (tens)
3210987654321098<b>7</b>65432109876543210987654321098765432109876543210 (ones)
[000000][111111][222222][333333][444444][555555][666666][777777] (bytes)

Итак, если вы читаете по вертикали через две верхние строки (десятки и единицы), в столбце, который образует «47» (выделено жирным шрифтом), вы попадаете в левую скобку для байта с индексом 2. Поскольку скобки отмечают наиболее и младшие значащие биты, это означает, что вы попали в MSB байта по индексу 2. Этот бит имеет индекс 7 внутри байта, что означает, что его маска равна 1 << 7, или 128, или 0x80. </p>

Таким образом, бит проверяется с выражением buffer[2] & 0x80.

0 голосов
/ 09 декабря 2010

Отрицательные числа хранятся в дополнении 2, это означает, что 64-битный -1 = 0xFFFFFFFFFFFFFFFF.Если вы просто выберете 32 младших значащих бита, вы получите 0xFFFFFFFF = -1.Таким образом, предполагая, что вы имеете дело с числами, находящимися в 32-битном диапазоне, вы должны иметь возможность обрабатывать положительные и отрицательные числа одинаково.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...