Для 24-битной строки:
Когда вы анализируете шестнадцатеричную строку, стандартная функция strtol
будет читать ее как значение без знака в диапазоне 0 -> 2^24 - 1
.
Диапазон 0 -> 2^23 - 1
является правильным, но диапазон 2^23 -> 2^24 - 1
необходимо сопоставить с -2^23 -> -1
, что является простым вычитанием, которое можно выполнить следующим образом.
if (result >= (1L << 23))
result -= (1L << 24);
Чтобы преобразовать 32-битную строку с использованием той же техники, вы должны использовать промежуточный тип, который может представлять полное 32-битное целое число без знака в типе со знаком для выполнения вычитания. long long int
гарантированно будет 64-битным, так что вы можете использовать это.
* 1016 Е.Г. *
long int ParseHexStr(const char *in, int bits)
{
char* endptr;
long long int result;
result = strtoll(in, &endptr, 16);
/*
** TODO - error checking, e.g. check endptr != in
** Also check for range errors, signalled by LLONG_MIN
** LLONG_MAX and a errno == ERANGE.
*/
if (result >= (1LL << (bits - 1))
result -= (1LL << bits);
return result;
}