IT

기초컴퓨터프로그래밍 C언어(3)-기호상수, 진법변환, 데이터형 크기

배채 2024. 12. 30. 12:02

목차

  1. 기호 상수- 기호 상수의 정의 기호 상수의 사용 예제 진법 변환
  2.  2진법, 8진법, 16진법의 개념 진법 변환 방법 및 예제 데이터형 크기
  3.  데이터형의 종류와 크기 각 데이터형의 메모리 사용량 문자형 데이터
  4.  문자형 데이터의 정의 아스키 코드와 문자형 데이터

이번 포스팅은 메모리와 관련되어있습니다. 최대한 어려운 내용을 뺐으니 잘 봐주시고 일단 이런게 있다~하고 넘기세요.

해당 규칙들은 차근차근 다시 언급할겁니다.

 

먼저 기호상수입니다. 기호상수란? 말그대로 상수입니다. 변수에다가 지정된 값을 계속 재사용 하고싶을때 사용됩니다. 기호상수를 사용하면 프로그램이 무거워질경우 유지보수가 용이해지고 잡버그를 줄일 수있습니다. 기호상수를 2가지로 구현할건데 저번 포스팅에서 보여드렸던 예제를 사용할게요

 

#include<stdio.h>

#define PI 3.14
int main(void) {

	double radius;
	
	printf("원의 반지름을 입력하시오");

	scanf_s("%lf", &radius);

	double area = PI * radius * radius;

	printf("원의 넓이는 %lf입니다.", area);



	return 0;

}

main문 위에 PI라는 상수를 3.14로 정의해줍니다. 이를 전처리과정이라하는데 별거없고 #define 상수 값 이렇게 지정해주면됩니다. 전처리과정에서는 ;를 안써줍니다.

 

두번째 방법입니다.

#include<stdio.h>


int main(void) {

	double radius;
	const double PI = 3.14;
	printf("원의 반지름을 입력하시오");

	scanf_s("%lf", &radius);

	double area = PI * radius * radius;

	printf("원의 넓이는 %lf입니다.", area);



	return 0;

}

 

3.14는 실수이죠? 그러니 double형으로 지정해주고 그 앞에 const를 붙여줍니다. 영어로 '변하지않는'뭐 이런뜻이죠? 값을 바뀌지않게 고정시켜주는 역할을 합니다. 지금은 가벼운 프로그램이라 버그가 잘 안나지만, 나중에 협업을하거나 무거운 프로그램을 짜면 값을 고정시켜주는(즉 상수처리)것이 좋습니다.

 

 

C 언어에서 각 데이터형은 일정한 메모리 크기를 차지하며, 이는 시스템에 따라 달라질 수 있습니다. 일반적으로 많이 사용되는 데이터형의 크기는 다음과 같습니다:


char 1 문자 데이터형
int 4 정수 데이터형
float 4 단정도 실수형 데이터
double 8 배정도 실수형 데이터
long 4 또는 8 큰 정수 데이터형
long long 8 매우 큰 정수 데이터형

솔직히 기초단계에서는 아주 가벼운 예제밖에없으니 한번보고 금방잊을 수 있습니다. 그러니 그냥 이런게 있었구나 하고 넘어가시고 나중에 백준알고리즘을 공부할때 쓰이게 되니 캡쳐정도는 해주세요!

 

이런걸 왜 알고있어야하냐면 나중에 오버플로우가 발생할 수있기때문입니다. 예를 들어, unsigned char 데이터형은 0에서 255까지의 값을 가질 수 있지만, 이 범위를 초과하는 값이 할당되면 오버플로우가 발생합니다.

#include <stdio.h>

int main() {
    unsigned char x = 255;
    printf("Initial value: %u\n", x); // 출력: Initial value: 255

    x = x + 1;
    printf("After overflow: %u\n", x); // 출력: After overflow: 0

    return 0;
}

이 예제에서 x는 unsigned char 타입으로, 최대값인 255를 가집니다. 1을 더하면 오버플로우가 발생하여 0으로 돌아갑니다.

 

#include <stdio.h>

int main() {
    int maxInt = 2147483647; // int의 최대값 (2^31 - 1)
    printf("Maximum int value: %d\n", maxInt);

    maxInt = maxInt + 1; // 오버플로우 발생
    printf("After overflow: %d\n", maxInt); // 출력: After overflow: -2147483648

    return 0;
}

마찬가지로 지정된 메모리 이상의 값이 들어가면 값이 바뀌는 버그가 발생합니다.

 

오버플로우 방지 방법

  • 데이터형의 최대값을 확인하여 적절한 타입을 선택합니다.
  • 오버플로우가 발생할 수 있는 연산을 수행하기 전에 조건문 등을 통해 범위를 검사합니다.

이를 방지하기위해 데이터형의 값을 알고있어야합니다.

 

다음은 서식변환/형식지정자 정리입니다.

#include <stdio.h>

int main() {
    int num = 42;
    float pi = 3.14;
    char letter = 'A';
    char str[] = "Hello, World!";
    int* ptr = &num;

    printf("정수: %d\n", num);
    printf("Unsigned 정수: %u\n", num);
    printf("8진법: %o\n", num);
    printf("16진법: %x\n", num);
    printf("Floating-point: %f\n", pi);
    printf("자연대수: %e\n", pi);
    printf("문자: %c\n", letter);
    printf("문자열: %s\n", str);
    printf("포인터: %p\n", ptr);
    printf("퍼센세이티: %%\n");

    return 0;
}

printf("%d)만 있는것이아닌 여러가지가있습니다. 추후에 재언급하고 오늘은 %c만 볼게요

int main(void) {
    char code1 = 'A';
    char code2 = '65';

    printf("code1 = %c\n", code1); // %c: 문자 출력
    printf("code2 = %c\n", code2); // %c: 문자 출력
    printf("code1 = %d\n", code1); // %d: 정수형 ASCII 값 출력
    printf("code2 = %d\n", code2); // %d: 정수형 ASCII 값 출력

    return 0;
}

아스키코드라고 들어보셨나요? 컴퓨터에는 문자 하나하나가 정수형으로 정해져있습니다.

즉 문자를 숫자로 출력하라고하면 해당 아스키코드값이 출력됩니다.

B는 어떻게 출력할까요? 그냥 +1해주면 됩니다.

printf("code1 = %c\n", code1+1); // %c: 문자 출력

마지막으로 아스키코드를 표로 정리해드렸으니 캡쳐하시고 필요할때마다 참고하십시요.

 

0 0x00 NUL (Null) 문자

1 0x01 SOH 헤드의 시작

2 0x02 STX 텍스트의 시작

3 0x03 ETX 텍스트의 끝

4 0x04 EOT 전송의 끝

5 0x05 ENQ 질의

6 0x06 ACK 승인

7 0x07 BEL 

8 0x08 BS 백스페이스

9 0x09 TAB 수평 탭

10 0x0A LF 줄 바꿈

11 0x0B VT 수직 탭

12 0x0C FF 폼 피드

13 0x0D CR 캐리지 리턴

14 0x0E SO 시프트 아웃

15 0x0F SI 시프트 인

16 0x10 DLE 데이터 연결 이스케이프

17 0x11 DC1 장치 제어 1

18 0x12 DC2 장치 제어 2

19 0x13 DC3 장치 제어 3

20 0x14 DC4 장치 제어 4

21 0x15 NAK 부정 응답

22 0x16 SYN 동기화

23 0x17 ETB 블록 전송의 끝

24 0x18 CAN 취소

25 0x19 EM 미디어의 끝

26 0x1A SUB 대체

27 0x1B ESC 이스케이프

28 0x1C FS 파일 구분자

29 0x1D GS 그룹 구분자

30 0x1E RS 기록 구분자

31 0x1F US 단위 구분자

32 0x20 ' ' 공백

33 0x21 ! 느낌표

34 0x22 " 큰 따옴표

35 0x23 # 

36 0x24 $ 달러

37 0x25 % 퍼센트

38 0x26 & 앤드

39 0x27 ' 작은 따옴표

40 0x28 ( 왼쪽 괄호

41 0x29 ) 오른쪽 괄호

42 0x2A * 

43 0x2B + 더하기

44 0x2C , 쉼표

45 0x2D - 마이너스

46 0x2E . 

47 0x2F / 슬래시

48 0x30 0 숫자 0

49 0x31 1 숫자 1

50 0x32 2 숫자 2

51 0x33 3 숫자 3

52 0x34 4 숫자 4

53 0x35 5 숫자 5

54 0x36 6 숫자 6

55 0x37 7 숫자 7

56 0x38 8 숫자 8

57 0x39 9 숫자 9

58 0x3A : 콜론

59 0x3B ; 세미콜론

60 0x3C < 작다

61 0x3D = 같다

62 0x3E > 크다

63 0x3F ? 물음표

64 0x40 @ 앳사인

65 0x41 A 대문자 A

66 0x42 B 대문자 B

67 0x43 C 대문자 C

68 0x44 D 대문자 D

69 0x45 E 대문자 E

70 0x46 F 대문자 F

71 0x47 G 대문자 G

72 0x48 H 대문자 H

73 0x49 I 대문자 I

74 0x4A J 대문자 J

75 0x4B K 대문자 K

76 0x4C L 대문자 L

77 0x4D M 대문자 M

78 0x4E N 대문자 N

79 0x4F O 대문자 O

80 0x50 P 대문자 P

81 0x51 Q 대문자 Q

82 0x52 R 대문자 R

83 0x53 S 대문자 S

84 0x54 T 대문자 T

85 0x55 U 대문자 U

86 0x56 V 대문자 V

87 0x57 W 대문자 W

88 0x58 X 대문자 X

89 0x59 Y 대문자 Y

90 0x5A Z 대문자 Z

91 0x5B [ 왼쪽 대괄호

92 0x5C \ 백슬래시

93 0x5D ] 오른쪽 대괄호

94 0x5E ^ 캐럿

95 0x5F _ 밑줄

96 0x60 ` 백틱

97 0x61 a 소문자 a

98 0x62 b 소문자 b

99 0x63 c 소문자 c

100 0x64 d 소문자 d

101 0x65 e 소문자 e

102 0x66 f 소문자 f

103 0x67 g 소문자 g

104 0x68 h 소문자 h

105 0x69 i 소문자 i

106 0x6A j 소문자 j

107 0x6B k 소문자 k

108 0x6C l 소문자 l

109 0x6D m 소문자 m

110 0x6E n 소문자 n

111 0x6F o 소문자 o

112 0x70 p 소문자 p

113 0x71 q 소문자 q

114 0x72 r 소문자 r

115 0x73 s 소문자 s

116 0x74 t 소문자 t

117 0x75 u 소문자 u

118 0x76 v 소문자 v

119 0x77 w 소문자 w

120 0x78 x 소문자 x

121 0x79 y 소문자 y

122 0x7A z 소문자 z

123 0x7B { 왼쪽 중괄호

124 0x7C \ 수직 막대

125 0x7D } 오른쪽 중괄호

126 0x7E ~ 물결표시

127 0x7F DEL

반응형