x0FANSA-hk 님의 블로그
10진수 16진수 자동변환 계산기 본문
제가 MJSEC에서 활동하거나 지능형센서응용을 수강하며 느낀점인데 제가 10진수와 16진수를 정말 어지간하게 헷갈립니다. 가장 심한 부분은 주소는 16진수인데, sizeof결과는 10진수여서 둘을 써있는데로 더하면 틀린 값이 나옵니다. 이것을 windows계산기를 개발자모드로 쓰면 되기는 하는데, 16진수를 10진수로 바꿔서 10진수를 더하는 것과 같은것은 잘 되지 않습니다. 따라서 이번에는 제가직접 제가 사용할 10진수 16진수 자동변환 계산기를 만들었습니다. 이건 뭐 마음먹고 30분만에 만든 간단한 프로그램이니까(글쓰는데 더 오래걸리네요) 편하게 가져다 쓰세요. 저작권없음.
#include <stdio.h>
#include <stdint.h>
int main(void)
{
char as[100],bs[100];
int64_t ai,bi;
char c;
printf("Decimal Hex Calculator\n\n");
top:
printf("Input Operand1: ");
if (scanf("%s",as)==1) sscanf(as,"%i",&ai);
else {printf("Invalid Input\n"); goto Continue;}
printf("Input Operand2: ");
if (scanf("%s",bs)==1) sscanf(bs,"%i",&bi);
else {printf("Invalid Input\n"); goto Continue;}
printf("%lld=%llx\n",ai,ai);
printf("%lld=%llx\n",bi,bi);
printf("%s + %s = %lld (%llx)\n\n",as,bs,ai+bi,ai+bi);
Continue:
printf("==============================\nContinue? (Y/N): ");
fflush(stdin);
scanf("%c",&c);
if(c=='Y'||c=='y') goto top;
return 0;
}
여기서의 치트키는 sscanf와 %i입니다. 그냥 끝내긴 뭣하니 간략히 설명만 할게요.
sscanf
스스스스켄에프 scanf함수랑 많이 비슷하게 생겼습니다. 하는일도 비슷해요.
우리가 아마 scanf로 무언가를 받는다면... 예시를 들자면...
EX1) 정수를 1개 받는다: scanf("%d",&a);
EX2) 정수를 3개 받는다. 단 첫번째 정수와는 공백, 두번째 정수와는 쉼표로 구별된다.: scanf("%d %d,%d",&a,&b,&c);
EX3) 정수1개, 문자열 1개, 소수 1개를 ', '로 구별해서 순서대로 받는다.: scanf("%d, %s, %f",&a,b,&c);
이런식으로 작성을 합니다.
이때 받은 문자열을 형식에 맞게 쪼개는 것을 볼 수 있습니다.
가령 EX3에서 입력을 "341000, line4, 0.1993" 을 입력하면 첫번째 인자인 %d는 정수가 끝나는 곳인 0까지(왜냐하면 ,는 정수에 못들어가니까요.), 그리고 지정된 형식에 맞게 ', '로 구별이 되어있으니 건너뛰고, 그 다음에 문자열이 오기를 기대하는데 "line4,"라는 문자열이 왔으니 "line4," 를 통으로 읽기에 그 다음형식은 ', '을 기대했지만 ' '만 나와서 오류가 발생합니다. 따라서 정상적으로 동작하려면 "341000, line4,, 0.1993" 을 입력해서 지정된 양식에 맞게 문자열을 잘라주게 해야합니다.
여기까지가 scanf이고 sscanf도 똑같습니다. 딱 하나 차이점은 scanf는 우리가 지금 당장 입력한 문자열을 각각 잘라서 저장한다면, sscanf는 어디에 저장된 문자열을 각각 잘라서 저장한다는 것 입니다. 즉 sscanf의 경우 scanf랑은 다르게 맨 앞에 문자열의 주소가 매개변수로 들어갑니다. 다만 우리가 보통 scanf를 해봤자 변수 한두개 받는용으로만 써서 sscanf가 상대적으로 어려워보인거지, 실제로는 완전히 동일한 함수입니다. 다 필요없고 뭘 자를지'만' 다른것이지요.
%i
딱 보면 C언어의 형식지정자처럼 생기지 않았습니까? 맞습니다. 역시 정수를 다루는 형식지정자입니다.
다만 일반적인 정수 형식 지정자와는 다르게 %i의 기능은 좀 독특합니다. 바로 정수 앞에 무언가(이런걸 접두사라고 불러요.)가 있으면 그것에 따라 값을 다르게 해석합니다. 앞에 아무것도 없이 숫자로 시작하면 10진수, 0x로 시작하면 16진수, 0x는 아니고 그냥 0으로 시작하면 8진수로 자동 타입캐스팅하여 저장됩니다. 예시를 들자면...
EX1) 1234: 10진수 1234로 저장이 됩니다.
EX2) 0x1234: 앞에 0x가 있으므로 16진수 1234, 즉, 10진수 4660으로 저장이 됩니다.
EX3) 01234: 앞에 0이 있으므로 8진수로 1234, 즉, 10진수로 688로 저장이 됩니다.
즉, 이번에 제가 만든 프로그램도 8진수를 쓰고싶으면 숫자 맨 앞에 0을, 16진수를 쓰고싶으면 숫자 맨 앞에 0x를, 그 외의 경우는 10진수로 알아서 계산해줍니다. 위의 코드에서 sscanf(as,"%i",&ai);를 쓴 것도 사용자 입력을 일단은 문자열형태로 받고, %i형식으로 sscanf가 변환해서 저장한다는 컨셉입니다.
실행화면


'Satellite' 카테고리의 다른 글
| 8비트 LED버스 제작하기 (0) | 2026.07.13 |
|---|---|
| ESP-NOW 간략하게 다뤄보기 (1) | 2026.07.09 |
| ESP32-C3-OLED 워밍업 (0) | 2026.06.30 |
| n자리 난수생성기 (1) | 2026.04.30 |
