32 ビットまたは 24 ビットの符号付き (2 の補数) 16 進文字列を long int に変換する関数が必要です。(long int のサイズに関係なく) 32 ビット マシンと 64 ビット マシンの両方で動作し、マシンが 2 の補数マシンであるかどうかに関係なく動作する必要があります。
解決:
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;
}