2010-09-25 2 views
4

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

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

+0

Какой язык? – codaddict

+0

Язык программирования ??? –

+0

Откуда у вас это 0xfb869e -293218? strtol на самом деле прав. – vanza

ответ

0
0xfb869e == 0x00fb869e == 16483998 

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

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

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

char buf = "fb869e" - Я хочу преобразовать в подписанный int. Значение o/p должно быть -293218. Я просто попытался преобразовать строку в long int. Но я не получаю отрицательную ценность. – ulaganathan

+0

char buf = "fb869e". Я хочу преобразовать это в подписанный int. Поэтому o/p должен быть -293218. Я просто попытался преобразовать строку в long using strtol. Но я не получаю отрицательные значения. Мои шестнадцатеричные значения приведены ниже. Мне нужно o/p в подписанном int. "C программирование" 80000e fcc15e 7ffffe 0b778e 80000e ee4dae 7ffffe 1b1e5e 80000e de2b9e 7ffffe 2b8c4e 80000e ce2e1e 7ffffe – ulaganathan

+0

@ulganathan: Был ошибка в моем ответе. Вместо этого используйте 'if (n> 0x7fffff) ...'. –

0

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

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

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

0

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

+0

char buf = "fb869e". Я хочу преобразовать это в подписанный int. Поэтому o/p должен быть -293218. Мои шестнадцатеричные значения приведены ниже. Мне нужно o/p в подписанном int. 80000e fcc15e 7ffffe 0b778e 80000e ee4dae 7ffffe 1b1e5e 80000e de2b9e 7ffffe 2b8c4e 80000e ce2e1e 7ffffe – ulaganathan

4

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

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

char *buf = "fb869e"; 
long n; 

n = strtol(buf, NULL, 16); 
if (n > 0x7fffffL) 
    n -= 0x1000000L; 
+0

спасибо много .... Эта вещь облажался меня за последние 3 часа ... Еще раз большое спасибо за вашу помощь .... – ulaganathan

1

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

int i; 
char *buf = "fb869e"; 
if (sscanf(buf, "%x", &i) == 1) 
    ... 
+0

Спасибо за ваш ответ ...... – ulaganathan

0

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

Смежные вопросы