Мне нужно преобразовать шестнадцатеричные 4-значные значения в десятичные, поэтому я использовал ssscanf, но он не работает с отрицательными числами... Например, int test;
sscanf("0xfff6","%x",&test);
возвращает 65526 вместо -10. Как я могу это решить?
sscanf с шестнадцатеричным отрицательным значением
Ответы (4)
Вы должны сделать это вручную. Спецификатор преобразования x
выполняет преобразование из unsigned int
и требует аргумент типа указатель на unsigned int
. Например, с актерским составом:
unsigned int test;
int result;
sscanf("0xfff6","%x", &test);
result = (int16_t) test;
Тот факт, что значение test
больше 32 КБ, указывает на то, что это "длинное" целое число (32 бита)... таким образом, он не видит бит знака. Вам нужно будет прочитать значение в короткое целое без знака, а затем ввести его в короткое со знаком, чтобы увидеть отрицательное значение...
Я думаю, что основная проблема заключается в том, что вы предполагаете, что int составляет 16 бит, тогда как в вашей системе он кажется больше.
Int всегда знаковый, поэтому тот факт, что он сообщает результат как 65525, доказывает, что INT_MAX больше, чем 16-битное значение 36727.
Попробуйте изменить свой код с int text на короткий тест, и я подозреваю, что это сработает.
Вероятно, это связано с тем, что ваши целые числа имеют ширину более 16 бит, поэтому fff6
действительно положительное - вам может понадобиться fffffff6
или даже больше, чтобы правильно представить отрицательное число.
Чтобы исправить это, просто поместите следующее после scanf
:
if (val > 32767) val -= 65536;
Это настраивает значения с установленным старшим битом (в 16-битных терминах) как отрицательные.
short test;
, вы могли бы получить ожидаемый ответ... - person Floris   schedule 11.02.2013