진수 변환을 공부하는 이유
진수 변환은 임베디드 장치로부터 나온 Data를 분석하는 과정이다.
- 장치는 2진수 → 16진수로 표현한다.
- 개발자는 16진수 → (2진수) → 10진수로 빠르게 변환해서 이해해야 한다.
16진수를 쓰는 이유
컴퓨터는 기본적으로 2 진수를 사용하고, 사람은 10진수를 사용한다.
사람이 알아보기 힘든 2진수를 10진수로 변환하는데 계산이 오래 걸린다.
2진수를 보다 알아보기 쉽게 쓰기 위해 16진수를 사용한다.
예를 들어 1Byte로 표현할 수 있는 0b00001111는 16진수로 0x0F로 나타낼 수 있다.
만약 int타입의 변수를 이진수로 나타내면 32Bit로 나타내야 한다.
long long등의 타입을 나타낸다면 읽어야할 이진수가 너무 길기때문에 사람이 이해하기 너무 어렵다.
진수 표기방법
2진수 표기 방법
표기 방법 : [숫자0] + [b] + [2진수]
ex) 0b100010110, 0b1111000111
16진수 표기 방법
표기 방법 : [숫자0] + [x] + [16진수]
ex) 0x4F10011F
진수의 특징
- 10 진수에 10을 곱하면 한 자리수가 더 생긴다.
- 100 * 10 = 1000
- 2 진수에 2 를 곱하면 한 자리수가 더 생긴다.
- 0b1101 * 2 = 0b11010
- 16 진수에 16을 곱하면 한 자리수가 더 생긴다.
- 0xAB * 16 = 0xAB0
2진수와 16진수 변환
2진수의 뒤에서부터 네 자리씩 끊어서 16진수로 즉시 변환 가능하다.
2Byte 크기의 2진수가 있다.
이를 4비트씩 끊어 읽는다면 쉽게 16진수로 변환이 가능하다.
ex) 0b 1111 0000 1111 0000 = 0x F 0 F 0, 0b1111000011110000 = 0xF0F0
반대로 16진수에서 2진수로의 변환도 동일하게 빠르게 할 수 있다.
ex) 0x C 7 8 E = 0b 1100 0111 1000 1110, 0xC78E = 0b1100011110001110
문자열 → n진수 변환
long strtol(char const* str, char** endptr, int base)
- strtol() 함수를 통해 문자열에서 숫자를 추출해 n진수로 변경할 수 있다.
- strtol메서드를 사용하기 위해선 <stdlib.h> 필요
- str : 문자열
- endptr : 문자열 끝 포인터
- base : 변환 될 문자열의 진수 ( 2, 8, 16, 10 선택 )
- return : 성공 → 변환된 정수, 실패 → 0
#include<stdio.h>
#include<stdlib.h>
int main() {
char val1[10] = "10";
char val2[10] = "10";
char val3[10] = "10";
char val4[10] = "10";
int result16 = strtol(val1, NULL, 16);
int result2 = strtol(val2, NULL, 2);
int result8 = strtol(val3, NULL, 8);
int result10 = strtol(val4, NULL, 10);
printf("%d\n", result16);
printf("%d\n", result2);
printf("%d\n", result8);
printf("%d\n", result10);
return 0;
}
정수 → n진수 문자열 변환
int sprintf(char* str, const char* format, ...)
- 문자열에 지정한 형식으로 담는다.
- <stdio.h>가 필요하다.
- 문자열 끝에 ‘\0’이 자동으로 추가된다.
- str : 변환된 문자열을 담을 버퍼
- format : string 문자 서식
- return : 성공 → byte 수, 실패 → -1
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main() {
int a = 100;
char buf[10] = { 0 };
sprintf(buf, "%X", a);
printf("%s", buf);
return 0;
}
'임베디드 > 임베디드 C언어' 카테고리의 다른 글
[C] C언어 비트 연산 (0) | 2024.09.29 |
---|---|
[C] C언어 메모리 주소와 포인터, 변수 배열 문자열 포인터 (6) | 2024.09.29 |