преобразовать строку в подписанное int - PullRequest
4 голосов
/ 25 сентября 2010

Я хочу преобразовать строку в подписанное int. Следующее является требованием. Я сохранил шестнадцатеричное значение в виде строки в буфере. Теперь я хочу преобразовать это значение в подписанное int.

buf = "fb869e" Преобразуйте это в подписанное int. Так что о / п должно быть -293218. но когда я пытаюсь конвертировать, используя strtol, я получаю 16483998. Так что мне делать?

Ответы [ 6 ]

4 голосов
/ 25 сентября 2010

Шестнадцатеричное число 0xfb869e равно , а не отрицательно. Встроенные функции преобразования чисел не будут преобразовывать его в отрицательное значение, поскольку его значение положительное.

То, что вы говорите, это то, что это шестнадцатеричный эквивалент без знака 24-битного дополнения до 2s отрицательного числа, и вам нужно это число. Чтобы получить его, нужно преобразовать его в положительное число, а затем использовать вычисления, чтобы преобразовать его в 24-битный эквивалент дополнения 2s:

char *buf = "fb869e";
long n;

n = strtol(buf, NULL, 16);
if (n > 0x7fffffL)
    n -= 0x1000000L;
1 голос
/ 25 сентября 2010

Другие предложили strtol(). Я просто хочу упомянуть sscanf() в качестве альтернативы, например:

int i;
char *buf = "fb869e";
if (sscanf(buf, "%x", &i) == 1)
   ...
0 голосов
/ 21 июня 2012

Используйте strtol, который преобразует string в long целое число.

0 голосов
/ 25 сентября 2010

почему 0x00fb869e должно быть отрицательным числом?вам нужно предоставить базу вашей системы счисления, чтобы даже было разрешено определить, является ли значение в одном формате отрицательным в другом формате

0 голосов
/ 25 сентября 2010

strtol преобразует строку в длинное целое число

Вывод правильный и будет 16483998

И если вы используете atoiв то время как он преобразуется в строку в целое число, возвращается правильное значение, если он находится вне диапазона представляемых значений, INT_MAX или INT_MIN.

0 голосов
/ 25 сентября 2010
0xfb869e == 0x00fb869e == 16483998

Как целое число со знаком, старший бит должен быть установлен для получения отрицательного числа.Поскольку старший бит данного числа не установлен, он должен быть положительным.

Если вы хотите, чтобы число обрабатывалось как 24-битное число, вам нужно добавить бит 23 коставшиеся старшие биты.Вот один из способов сделать это:

long n = strtol(...);
if (n > 0xffffff) n |= 0xff000000;
...