C 입출력 ASCII 코드 그리고 비트 연산자 | dasfef

2023.02.20


//scanf 와 입력값의 변화

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void)
{
    int x;
    
    printf("입력 값 : ");
    scanf("%i", &x);				// 정수를 8, 10, 16진수로 가져옴
    printf("%d", x);				// 10진수
    printf("%o", x);				// 8진수
    printf("%x", x);				// 16진수
}


scanf 함수를 활용하기 위해선 #define _CRT_SECURE_NO_WARNINGS 의 정의가 필요하다 혹은 scanf_s 함수를 활용할 수 있다.

* scanf 함수를 이용해보면서 헷갈렸던 것 다양한 서식 지정자 중 %i 에 관한 것이 이해하기 힘들었다. 내가 보던 책에는 “정수를 10진수, 8진수, 16진수로 입력” 이라고만 설명이 되어 있었고, 그래서 예시라든지 다른점이 뭔데? 라고 생각이 들었다.


복습하던 중 확실히 이해할 수 있었다. 즉, scanf 함수를 통해 입력 받은 값이 메모리에는 10진수, 8진수, 16진수로 입력이 되어있고 이것을 printf 함수에서의 서식 지정자를 활용해 각 진수로 표현할 수 있던 것이었다.


나는 python의 input 만 써봤는데 그래서 그런지 간단하면서도 쉬운 원리들이 막상 정해진 룰대로만 해야 한다는 C를 접해보면서 간혹 어려움에 빠지고 있다.


위의 코드와 같이 작성을 하고 실행해보자


0x12 라는 값을 넣어주자 각 진수에 해당하는 값이 나온다 scanf() 에서 %i 서식 지정자로 0x12에 해당하는 정수를 가져온 것이고 이를 8, 10, 16진수로 저장해두고 있는 상태이다.
printf() 에서 %o(8진수) / %d(10진수) / %x(16진수) 로 값을 가져오자 각각에 해당하는 진수를 출력하고 있다.

ASCII 코드란 : American Standard Code for Information Interchange 의 줄임말이다. 코드표는 간단한 구글링으로 여러 이미지를 찾아볼 수 있으니 참조.
10진수로 표현되는 각 수에 16진수 그리고 char 형이 들어있다. (예) char : A = dec : 65 = hex : 41 A 대문자는 10진수의 65, 16진수의 41로 표현될 수 있다는 뜻이다.
대문자 A 부터 65, B 66, C 67 … 등으로 나아가며 이러한 코드표의 진수 크기차로 인해 문자간의 연산도 가능하다.

#define _CRT_SECURE_NO_WARNINGS		//scanf() 함수 사용시 필요
#include <stdio.h>

int main(void)
{
	int a;
    
    printf("수를 입력하세요 : ");
    scanf("%i%", &a);
    
    printf("8진수 : %o", a);
    printf("10진수 : %d", a);
    printf("16진수 : %#02x", a);	// x 앞에 # 을 붙여 0x 부분도 표현
}

‘%x’ 사이에 # 을 붙여 02(자리수) 와 함께 0x ~ 되는 부분을 표현할 수 있다.




파이썬에선 논리 연산자만 사용해본 기억이 있다. 비트 자체에 연산을 한다는 개념에 상당 부분 충격을 먹었다.


논리 연산자 : x && y / x   y / !x
비트 연산자 : x & y / x y / x ^ y / ~x / x « y / x » y  

* 비트 연산자를 활용한 좋은 문제

[ RGB 색상 표기법 ] 32비트로 저장되는 RGB 색상 Red, Green, Blue 가 있다. 최상위 1바이트는 사용하지 않고, 각 색상이 1바이트씩 차지하고 있다. Red : 최하위 / Green : 중간 / Blue : 상위 / Not Used : 최상위 unsigned int 를 활용하여 각 색상의 값을 입력하였을 때 RGB 색상을 출력하시오.

ex) red 값 입력 : 256 –> 256이 아닌 0으로 저장되어야 함 green 값 입력 : 128 blue 값 입력 : 255 RGB 색상 : FF8000


#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void)
{
	unsigned int red, green, blue;				// unsigned int = 0 ~ 255
	unsigned int mask = 0xff;				// 0xff = 8비트 2진수 : 1111 1111
	unsigned int rgb = 0;

	printf("Red 값 입력 : ");
	scanf("%i", &red);
	red &= mask;

	printf("Green 값 입력 : ");
	scanf("%i", &green);
	green &= mask;

	printf("Blue 값 입력 : ");
	scanf("%i", &blue);
	blue &= mask;

	rgb = red | (green << 8) | (blue << 16);		// (not used)(blue)(green)(red) 8비트씩
	printf("RGB : %06X", rgb);

}



이전 페이지로 이동