Мне нужна функция для преобразования 32-битной или 24-битной шестнадцатеричной строки со знаком (в двух дополнениях) в длинное int. Должен работать как на 32-битных, так и на 64-битных машинах (независимо от размера long int) и работать независимо от того, является ли машина машиной с дополнением до двух или нет.
РЕШЕНИЕ:
long int hex2li (char hexStr[], int signedHex)
{
int bits = strlen (hexStr) * 4;
char *pEnd;
long long int result = strtoll (hexStr, &pEnd, 16);
if (pEnd[0] == '\0')
{
if (signedHex)
{
if (result >= (1LL << (bits - 1))) result -= (1LL << bits);
}
return (long int) result;
}
return LONG_MIN;
}
8
,9
,A
,B
,C
,D
иE
, тоже должны быть отрицательными. - person caf   schedule 07.05.2010long
- 32 бита. FFFFFFFF больше максимального значения, представимого в 32-битном значении со знаком, поэтому 2 ^ 31 -1 является наибольшим представимым значением, поэтому оно используется вместо него. - person CB Bailey   schedule 08.05.2010FFFFFF
иFFFFFFFF
на-1
. - person Cheetah   schedule 09.05.2010pEnd
иhexStr
, чтобы увидеть, сколько цифр было преобразовано, но это будет весьма необычный интерфейс. Вы действительно хотите рассматривать 00FFFF и FFFF как разные числа? От чего в спецификации говорится, что вы получаете ваш вклад? - person CB Bailey   schedule 09.05.2010int bits = strlen (hexStr) * 4;
. У меня есть решение из вашего сообщения ниже:if (result >= (1LL << (bits - 1))) result -= (1LL << bits);
- person Cheetah   schedule 09.05.2010