임베디드/임베디드 C언어

[C] C언어 진수 변환

마달랭 2024. 9. 29. 21:13
반응형

진수 변환을 공부하는 이유

진수 변환은 임베디드 장치로부터 나온 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;
}

 

 

 

728x90
반응형