Как позволить функции strtol () в C интерпретировать строку как число дополнения до двух? - PullRequest
1 голос
/ 04 ноября 2019

Я хочу преобразовать данную строку в целое число. Однако я понял, что strtol () будет интерпретировать такие вещи, как «0xffc», как имеющие значение 4092, вместо того, чтобы интерпретировать его как число дополнения до 2, которое должно быть -4. Я не могу изменить строку, так как она указана в качестве аргумента командной строки. Итак, как я могу получить целое число, которое является результатом интерпретации данной строки как числа дополнения 2?

Ответы [ 2 ]

1 голос
/ 04 ноября 2019

Значение 0xffc станет -4, если рассматривать его как 12-битное целое число (дополнение 2 с). В противном случае (int, short, ...) это просто 4092.

Рассмотрим

int v= strtol(v) ;
if ( v & 1<<11 ) v |= ~0xfff ;

Или для любого N-бит:

const int N = 12 ;
int v= strtol(v) ;
if ( v & 1<<(N-1) ) v |= ~ ((1<<N)-1) ;
0 голосов
/ 04 ноября 2019

Похоже, вы ожидаете 12-битные значения дополнения 2 с.
В этом пороге, то есть наивысшем положительном значении, является 2047 (0x8ff). Чтобы получить диапазон значений -2048 ... 2047 (диапазон для обычного "квазисимметричного" 12-битного представления), просто сделайте это с переменной, которая получила значение.

if(iValue>2047) /* note that in the wide range of the receiving variable, this makes sense */
{
    iValue-=4096; /* in the 16bit (or more) representation, this makes sense */
}

Этот код, конечно, делаетпредположим, что считанные значения находятся в пределах 0 .... 4095 и что принимающая переменная шире, чем 12 бит, но, похоже, вы это делаете.
Может показаться заманчивым выполнение 16-битных битовых операций, но для этого потребуются предположенияна битовой ширине содержащей переменную. Простое вычитание ТОЛЬКО соответствующего значения делает предположение о представленном меньшем диапазоне значений, а не о внутреннем представлении в переменной.

...