인프런 커뮤니티 질문&답변

aaa164949님의 프로필 이미지
aaa164949

작성한 질문수

홍정모의 따라하며 배우는 C언어

4.10 scanf() 함수의 사용법

질문이요

작성

·

259

1

printf() 함수의 변환 지정자들 강의에서는 변환 지정자 %o와 %x는 각각 부호가 없는 8진수 와 16진수의 printf 변환 지정자였는데 이번 강의를 통해서 보니 scanf 함수는 %o 와 %x가  부호가 있는 8진수 16진수 변환 지정자임을 알 수 있는데, printf 와 scanf의 다른 변환 지정자들은 의미가 비슷한데 %o 와 %x 만이 다른 이유가 있을까요?

답변 2

3

8진수와 16진수 자체가 - + 이런 부호가 붙지 않는 unsigned 입니다. 

111011110 👈 이건 이진수죠! 이진수는 일반 signed int 십진수와 달리 +- 부호가 붙지 않습니다. 왜냐하면 음수를 부호 없이 이진수로만 표현할 수 있기 때문이죠.  예를 들어 1 을 8 bit의 이진수로 표현한다면 00000001 이되고, -1 을 8 bit의 이진수로 표현한다면 11111111 입니다. 부호 붙여서 -00000001 로 -1을 표현하지 않습니다.  (혹시 이 부분이 이해가 가시지 않는다면 0.10 이진수 강의 10:05 분대를 다시 한번 참고해주세요)

8진수는 이진수의 3 개의 자리를 0~7 범위를 가지는 한 자리의 숫자로 묶어 표현한 것일 뿐이고 16진수는 이진수의 4 개의 자리를 0~9, A~E 범위를 가지는 한 자리의 숫자로 묶어 표현한 것일 뿐입니다. 예를들어  111011110  이 이진수는 8 진수로는 (111)(011)(110) 👉 736 으로 표현할 수 있고, 16 진수로는 (1)(1101)(1110) 👉 1DE 로 표현할 수 있습니다. 이처럼 8진수와 16진수는 각각 이진수를 3자리씩, 4자리씩 묶어 축약한 것이라고 생각하시면 되기 때문에 당연히 이진수처럼 부호로 양수 음수를 표현하지 않습니다. 

앞 설명이 길었네요. 따라서 결론은! printf 에서 %x 를 사용하여 '출력(output)' 하면 당연히 부호가 없을 수 밖에 없습니다. printf 에서의 %x 의미는 16진수로서 출력하겠다는 것인데 16진수 자체가 + - 이런 부호를 쓰지 않기 떄문이죠! 이진수를 4 자리씩 묶어 표현한게 16진수인데, 애초에 이진수는 부호로 양수 음수를 표현하지 않으니까요. 

scanf (input)의 %x 의미는 입력 받은 숫자를 16진수로서 저장하겠다는 것이지요.  scanf의 %x가 부호가 있는 수가 들어와도 되는 이유는, 입력 받는 수가 양수든 음수든 모두 16진수로 표현 및 저장이 가능 하기 때문입니다. -1 을 8 bit의 이진수로 표현한다면 11111111 이니, -1을 8 bit의 16진수로 표현하면 FF 가 되겠네요. 이처럼 입력 받는 수가 양수든 음수든 모두 16진수 혹은 8진수로 표현이 가능하기 때문에 부호 있는 정수를 받는 것입니다.

printf 변환 지정자들을 설명하신 4.7 강의를 다시 보시면 '출력 사항'이 부호가 없는 16진 정수라고 적혀있고, 질문 주신 scanf 4.10 강의를 다시 보시면 '입력'을 부호가 있는 16진 정수로 해석이라고 강의에 적혀 있는 것을 확인하실 수 있습니다.  정리하자면 출력이 부호가 없는건 단순히 16진수는 부호를 쓰지 않기 때문이고, 입력이 부호가 있는 정수를 받는 이유는 + 부호인 양수든 - 부호인 음수든 어떤 것이든 간에 16진수로 변환하여 저장이 가능하기 때문입니다.

printf("%x", 12); 👉 12를 16진수로 출력하겠다는 의미가 되는데 애초에 16진수는 부호가 없기 때문에 당연히 부호가 없는 16진 정수가 출력됩니다. 

int n;   scanf("%x", &n);   👉 입력 받는 수를 n 에 16진수로 저장하겠다는 의미가 됩니다. n 이 +양수든, - 음수든 상관없이 16진수로 n 에 저장이 가능하므로 입력 하는 수가 부호가 있든 없든 상관이 없습니다.

0

aaa164949님의 프로필 이미지
aaa164949
질문자

자세한 설명 감사합니다!

aaa164949님의 프로필 이미지
aaa164949

작성한 질문수

질문하기