sscanf с шестнадцатеричным отрицательным значением

Мне нужно преобразовать шестнадцатеричные 4-значные значения в десятичные, поэтому я использовал ssscanf, но он не работает с отрицательными числами... Например, int test; sscanf("0xfff6","%x",&test); возвращает 65526 ​​вместо -10. Как я могу это решить?


person Arie    schedule 10.02.2013    source источник
comment
Что такое sizeof(int) в вашем приложении? Готов поспорить, что это 32-битная версия... Если бы вы использовали short test;, вы могли бы получить ожидаемый ответ...   -  person Floris    schedule 11.02.2013


Ответы (4)


Вы должны сделать это вручную. Спецификатор преобразования x выполняет преобразование из unsigned int и требует аргумент типа указатель на unsigned int. Например, с актерским составом:

unsigned int test;
int result;

sscanf("0xfff6","%x", &test);
result = (int16_t) test;
person ouah    schedule 10.02.2013

Тот факт, что значение test больше 32 КБ, указывает на то, что это "длинное" целое число (32 бита)... таким образом, он не видит бит знака. Вам нужно будет прочитать значение в короткое целое без знака, а затем ввести его в короткое со знаком, чтобы увидеть отрицательное значение...

person Floris    schedule 10.02.2013

Я думаю, что основная проблема заключается в том, что вы предполагаете, что int составляет 16 бит, тогда как в вашей системе он кажется больше.

Int всегда знаковый, поэтому тот факт, что он сообщает результат как 65525, доказывает, что INT_MAX больше, чем 16-битное значение 36727.

Попробуйте изменить свой код с int text на короткий тест, и я подозреваю, что это сработает.

person Joe Fromm    schedule 10.02.2013
comment
Или нет, так как sscanf() запишет целое целое в хранилище коротких целых чисел! - person Mats Petersson; 11.02.2013
comment
Я не подумал об этом, но, конечно, вы правы. Хороший улов. - person Joe Fromm; 11.02.2013

Вероятно, это связано с тем, что ваши целые числа имеют ширину более 16 бит, поэтому fff6 действительно положительное - вам может понадобиться fffffff6 или даже больше, чтобы правильно представить отрицательное число.

Чтобы исправить это, просто поместите следующее после scanf:

if (val > 32767) val -= 65536;

Это настраивает значения с установленным старшим битом (в 16-битных терминах) как отрицательные.

person paxdiablo    schedule 10.02.2013