16 진수 변환 기능이 왜 하나씩 꺼져 있습니까?

조쉬 브래들리

나는 c를 배우려고하는데 왜 내 16 진수를 int로 변환 함수가 1에서 벗어난 값을 반환하는지 혼란 스럽습니다.

참고 : 0XAAAA == 46390

#include <stdio.h>
#include <math.h>

unsigned int hex_to_int(char hex[4]);

int main()
{
    char hex[4] = "AAAA";

    unsigned int result = hex_to_int(hex);
    printf("%d 0X%X\n", result, result);
    return 0;
}    

unsigned int hex_to_int(char input[4])
{
    unsigned int sum, i, exponent;

    for(i = 0, exponent = 3; i < 4; i++, exponent--) {
        unsigned int n = (int)input[i] - 55;
        n *= pow(16, exponent);
        sum += n;
    }   
    return sum;
}

산출:

46391 0XAAAB

업데이트 : 나는 이제 "-55"가 우스꽝 스럽다는 것을 깨달았습니다. 나는 이것을보고 기억을 잃었습니다.

if (input[i] >= '0' && input[i] <= '9')
    val = input[i] - 48;
else if (input[i] >= 'a' && input[i] <= 'f')
    val = input[i] - 87;
else if (input[i] >= 'A' && input[i] <= 'F')
    val = input[i] - 55;
룬딘

문자열이 null로 끝나지 않고 ASCII를 십진수로 변환하는 것과 같은 몇 가지 버그가 있고 (값 55?) 초기화하지 않는 sum등의 문제가 있습니다. 대신 다음을 수행하십시오.

#include <stdio.h>
#include <stdlib.h>

int main()
{
  char x[] = "AAAA";

  unsigned int sum = strtoul(x, NULL, 16);
  printf("%d 0X%X\n", sum, sum);
  return 0;
}    

편집하다

이 작업을 수동으로 수행해야하는 경우 :

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

unsigned int hexstr_to_uint(const char* str);

int main()
{
  char x[] = "AAAA";

  unsigned int sum = hexstr_to_uint (x);
  printf("%d 0X%X\n", sum, sum);
  return 0;
}    

unsigned int hexstr_to_uint(const char* str)
{
  unsigned int sum = 0;

  for(; *str != '\0'; str++)
  {
    sum *= 16;
    if(isdigit(*str))
    {
      sum += *str - '0';
    }
    else
    {
      char digit = toupper(*str);
      _Static_assert('Z'-'A'==25, "Trash systems not supported.");
      if(digit >= 'A' && digit <= 'F')
      {
        sum += digit - 'A' + 0xA;
      }
    }
  }
  return sum;
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

C ++에서 "문자열"을 16 진수로 변환하는 함수 나 공식이 있습니까?

16 진수 부분을 10 진수 부분으로 변환하는 더 빠른 방법이 있습니까?

왜 다른 진수 값이 16 진수 값을 얻을 수 있습니까?

hax에서 문자열을 16진수로 변환하는 방법이 있습니까?

이상한 색상 코드? 16 진수로 변환 하시겠습니까?

int를 16 진수의 2 바이트로 변환 하시겠습니까?

16 진수의 2의 보수를 10 진수로 수동으로 변환하는 알고리즘이 있습니까?

이 16진수를 이진 변환기로 수정하는 방법은 무엇입니까?

16진수를 10진수로 변환하면 예기치 않은 결과가 나타납니다.

QString을 16 진수로 변환 하시겠습니까?

16진수를 10진수로 변환하는 변환기를 개발 중입니다.

16 진수를 10 진수 (Lat / Lon)로 변환 하시겠습니까?

앱이 꺼져 있어도 신속하게 변수 저장

파이썬은 16 진수를 포함하는 문자열을 실제 16 진수로 변환합니다.

char로 변환하여 16진수 값을 나타냅니다.

C ++의 MIPS 변환기, 16 진수로 변환하는 방법

어떻게 바이트 내 문자열 (즉, 16 진수 값을 나타냅니다) 변환 할 수 있습니까?

왜이 변환을 할 수 있습니까?

C # 16 진수 문자열을 10 진수로 변환합니다. 왜 음수인가?

Javascript Date.UTC () 함수가 한 달씩 꺼져 있습니까?

이진 정수를 16 진수 문자열로 변환하는 방법은 무엇입니까?

기본 장치 회전이 꺼져있을 때 장치 방향을 변경할 수 있습니까?

Lua를 사용하여 정수를 항상 4 자리 16 진수로 변환하는 방법이 있습니까?

Javascript에서 고정 길이로 정수를 16 진수로 어떻게 변환 할 수 있습니까?

PDF의 페이지 번호가 꺼져 있습니다. 어떻게 변경할 수 있습니까?

Microsoft Surface Book-꺼져 있거나 전원이 꺼진 상태에서 화면을 분리 하시겠습니까?

여러 방법을 사용하여 16진수 값을 변환하면 다른 출력이 나타납니다.

LESS를 사용하여 rgba 색상을 16 진수로 변환 할 수 있습니까?

바이너리를 16 진수로 변환하고 연산을합니다.