답변:
다른 답변에 따라 이것은 괜찮습니다.
char c = '5';
int x = c - '0';
또한 오류 검사를 위해 isdigit (c)가 참인지 먼저 확인하는 것이 좋습니다. 예를 들어 다음과 같이 문자에 대해 완전히 이식 할 수는 없습니다.
char c = 'b';
int x = c - 'a'; // x is now not necessarily 1
표준은 숫자 '0'에서 '9'까지의 char 값이 연속적임을 보장하지만 알파벳 문자와 같은 다른 문자에 대해서는 보장하지 않습니다.
다음과 같이 '0'을 뺍니다.
int i = c - '0';
표준 C의 범위에있는 각 디지트를 보장한다 '0'..'9'(섹션에서 이전 자리에 1을 더한 5.2.1/3의 C99 초안 ). C ++도 마찬가지입니다.
우연의 일치로 문자열 을 정수 로 변환 하려면 그렇게 할 수도 있습니다!
char *num = "1024";
int val = atoi(num); // atoi = ASCII TO Int
val지금은 1024입니다. 분명히 atoi()괜찮습니다. 앞서 언급 한 내용은 저에게만 적용됩니다 (OS X (여기에 Lisp 농담 삽입)). 다음 예제에 대략적으로 매핑되는 매크로라고 들었습니다.이 매크로 strtol()는보다 일반적인 용도의 함수 인을 사용하여 대신 변환을 수행합니다.
char *num = "1024";
int val = (int)strtol(num, (char **)NULL, 10); // strtol = STRing TO Long
strtol() 다음과 같이 작동합니다.
long strtol(const char *str, char **endptr, int base);
으로 변환 *str하여 long기본 base숫자 인 것처럼 처리합니다 . **endptrnull이 아닌 경우 strtol()발견 된 첫 번째 숫자가 아닌 문자를 보유합니다 (하지만 누가 신경 쓰는지).
itoa_s().
char numeralChar = '4';
int numeral = (int) (numeralChar - '0');
numeralChar - '0'이미 유형 int이므로 캐스트가 필요하지 않습니다. 아니더라도 캐스트가 필요하지 않습니다.
문자 숫자를 해당 정수로 변환합니다. 다음과 같이하십시오.
char c = '8';
int i = c - '0';
위 계산의 논리는 ASCII 값을 사용하는 것입니다. 문자 8의 ASCII 값은 56, 문자 0의 ASCII 값은 48입니다. 정수 8의 ASCII 값은 8입니다.
두 문자를 빼면 ASCII 문자 사이에서 빼기가 발생합니다.
int i = 56 - 48;
i = 8;
이와 같은 작업을 수행해야 할 때 원하는 값으로 배열을 미리 굽습니다.
const static int lookup[256] = { -1, ..., 0,1,2,3,4,5,6,7,8,9, .... };
그러면 변환이 쉽습니다.
int digit_to_int( unsigned char c ) { return lookup[ static_cast<int>(c) ]; }
이것은 기본적으로 ctype 라이브러리의 많은 구현에서 취하는 접근 방식입니다. 16 진수로도 작동하도록 이것을 간단하게 조정할 수 있습니다.
예를 들어 숫자가 '5'ASCII이면 이진수 0011 0101(53)로 표시됩니다. 모든 숫자는 가장 높은 4 비트를 0011가지며 가장 낮은 4 비트는 bcd의 숫자를 나타냅니다. 그래서 당신은
char cdig = '5';
int dig = cdig & 0xf; // dig contains the number 5
가장 낮은 4 비트 또는 동일한 숫자를 가져옵니다. asm에서는 (다른 답변에서와 같이) and대신 작업을 사용 합니다 sub.
'5'53 (이다 00110101)
함수를 사용하십시오 : 배열에서 정수로의 경우 atoi, 배열에서 부동 유형으로의 경우 atof; 또는
char c = '5';
int b = c - 48;
printf("%d", b);