1) 입력 : scanf 함수(python의 input과 같은 기능)
//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진수) 로 값을 가져오자
각각에 해당하는 진수를 출력하고 있다.
2) ASCII 코드와 문자열 연산 원리
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 ~ 되는 부분을 표현할 수 있다.
3) 논리 연산자 / 비트 연산자
파이썬에선 논리 연산자만 사용해본 기억이 있다.
비트 자체에 연산을 한다는 개념에 상당 부분 충격을 먹었다.
논리 연산자 : 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);
}
'C' 카테고리의 다른 글
C 배열과 포인터 그리고 함수 적용 (1) | 2023.02.27 |
---|---|
C vs Python 함수와 배열 (0) | 2023.02.23 |
C vs Python 조건문, 반복문 (4) | 2023.02.22 |