C는 주요 0으로 정수 리터럴을 어떻게 처리하고, ATOI는 어떻습니까?

StackOverflow https://stackoverflow.com/questions/1661369

  •  12-09-2019
  •  | 
  •  

문제

주요 0으로 정수를 만들 때 C는 어떻게 처리합니까? C의 C 버전에 대해 다른가요?

제 경우에는 단지 떨어진 것 같습니다 (그러나 아마도 그것이 Printf가하는 일입니까?) :

#include <stdio.h>

int main() {
    int a = 005;
    printf("%i\n", a);
    return 0;
}

나는 printf를 사용하여 0으로 패드 할 수 있다는 것을 알고 있지만, 이것이 어떻게 작동하는지 궁금합니다.

도움이 되었습니까?

해결책

주요 0은 숫자가 표현되어 있음을 나타냅니다 10 월, 또는베이스 8; 따라서, 010 = 8. 추가 주요 0을 추가하는 것은 영향을 미치지 않습니다. 수학에서 기대할 수있는 것처럼 x + 0*8^n = x; 표현을 더 길게함으로써 가치에 변화가 없습니다.

이것을 자주 볼 수있는 곳은 Unix 파일 모드입니다. 0755는 실제로 7*8^2+5*8+5 = 493을 의미합니다. 또는 0022 = 2*8+2 = 10과 같은 Umask.

atoi(nptr) 동등한 것으로 정의됩니다 strtol(nptr, (char **) NULL, 10), 오류를 감지하지 않는 것을 제외하고는 atoi() 항상 소수점을 사용하므로 주요 0을 무시합니다). strtol(nptr, anything, 0) 다음을 수행합니다.

문자열은 임의 양의 공백으로 시작할 수 있습니다 (결정된대로 isspace(3)) 그 다음에는 단일 선택 사항이 뒤 따릅니다 '+' 또는 '-' 징후. 베이스가 0 또는 16 인 경우 문자열에 "0x" 접두사 및 숫자는 기본 16에서 읽습니다. 그렇지 않으면 다음 문자가 아닌 경우 제로베이스는 10 (소수)으로 간주됩니다. '0',이 경우 8 (10 월)로 간주됩니다.

따라서 C 컴파일러와 동일한 규칙을 사용합니다.

다른 팁

조심하세요!

이 진술에서 005 옥탈 상수입니다.

int a = 005;

이 경우 단일 숫자 옥탈 상수는 동등한 소수점 상수와 동일한 값을 가지기 때문에 C : 015 != 15

정수 문자가 10 대, 소수점 또는 16 진수로 표현 되든, 컴파일러에 의해 구문 분석되면 단지 값으로 취급됩니다. 정수가 어떻게 출력되는지 printf 유형, 값 및 형식 지정자 (및 활성 로케일)에만 의존합니다.

주요 0이 숫자를 나타낸다는 사실은 종종 잊혀진 것입니다. 누군가가 옥켓에 대해 정기적 인 형식을 사용하여 IP 주소를 입력하려고 할 때와 같이 여러 번 혼란을 일으켰습니다.

192.168.010.073

그리고 파서는 마지막 2 낙지를 8 월 숫자로 해석했습니다.

C의 불행한 점보다 더 나쁜 것은 숫자 10 대를 만들기 위해 주요 0을 사용하는 불행한 것보다 더 나쁜 것은 JavaScript의 주요 0을 처리하는 것입니다. 때때로 숫자 10를 만드십시오 (나머지 숫자가 괜찮은 경우 숫자는 8 월 - 8- 십진수). JavaScript에서 (017 == 15) 하지만 (018 == 18).

오히려 오류가 있습니다. 실제로 나는 오히려 10 대 문자 그대로의 지원을 완전히 떨어 뜨 렸습니다. 최소한 더 많은 접두사를 사용하십시오.

0t10  (ocTal 8)
0k17  (oKtal 15)

그러나 나는 나의 제안에 너무 늦었습니다.

0을 선도하는 숫자는 모든 버전의 C에서 옥탈 인코딩을 의미합니다. 011 == 9 == 0x9.

Octal은 8을 기준으로 한 번호 시스템입니다 (10 진수의 경우 10 개 대신 또는 16 진수의 경우 16 명). 그래서 011 == 1*8 + 1, 013 == 1*8 + 3, 등.

당신은 시도해야합니다 :

int a = 5;
printf("%03i\n", a);

0은 "0이있는 패드"를 의미하고 3은 원하는 길이의 출력 길이입니다.

편집하다: 죄송합니다. 질문을 너무 빨리 읽었습니다. 이제 완전히 다른 것에 대해 물었습니다. 그러나 다른 사람에게 도움이 될 수 있으므로 이것을 그대로 두십시오.

선두에있는 숫자 0 숫자가 10 월 숫자. 라고 불린다 정수 리터럴. 당신은 또한 사용할 수 있습니다 0b 표시를 위해 이진 번호, 을 위한 16 진수 그것은이다 0x 또는 0X. 당신은 아무것도 쓸 필요가 없습니다 소수. 코드 벨로우를 참조하십시오.

#include<stdio.h>

int main()
{
    int binary = 0b10;
    int octal=010;
    int decimal = 10;
    int hexa = 0x10;
    printf("%d %d %d %d\n", octal, decimal, hexa, binary);
}

자세한 내용은 방문하십시오 Tutorialspoint.

정수에는 "주요 0"A 5가 없으며 5는 5입니다. 원한다면 Printf 수정자가 있다는 경우 String 표현을 Leading 0으로 쓸 수 있습니다.

특정한 경우, 제로는 printf에 의해 떨어지고 있습니다.모든 선행 제로는 초기 0을 제외하고 컴파일러에 의해 제거되어 컴파일러가 정수를 Octal로 취급하게합니다. 005의 경우, 옥탈과 소수점 표현은 모두 동일하며 귀찮게해서는 안되지만 여전히 옥탈 표현을 의미하지 않는 한 문제를 요구하고 있습니다.

주요 0은 정수의 문자열 표현과 순전히해야합니다. 주요 0을 인쇄하려면 "%03d"를 사용하십시오. 이렇게하면 필드 길이가 3입니다.

일반적으로 "%u003Cx> D "정수 X 캐릭터를 넓게 인쇄하고 선행 공간으로 패드됩니다."%0u003Cx> D "도 똑같은 일을하지만 주요 제로와 함께 패드 할 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top