32 비트 또는 24 비트 부호있는 (2의 보수) 16 진수 문자열을 long int로 변환하는 함수가 필요합니다. 32 비트 및 64 비트 머신 모두에서 작동해야하며 (long int의 크기와 상관없이) 머신이 2의 보수 머신인지 여부에 관계없이 작동합니다.부호있는 16 진수 문자열을 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'로 시작하는 16 진수 문자열은 모두 음수 여야합니다. – caf
FFFFFF는 24 비트 부호있는 16 진수와 32 비트 부호있는 16 진수로 서로 다른 의미를 가지므로 두 가지 유형의 문자열을 처리하는 단일 기능을 사용할 수 없습니다. 또한, non-two의 보완 기계에서 진정한 요구 사항을 다루고 있습니까? –
'long '이 32 비트 인 컴퓨터에서 작업하는 것처럼 보입니다. FFFFFFFF가 32 비트 부호있는 값에서 표현할 수있는 최대 값보다 크기 때문에 2^31 -1이 가장 큰 표현 가능 값이므로 대신 사용됩니다. –