본문 바로가기
프로그래밍/C언어

2. c언어 자료형 문자형, 정수형, 실수형, 기수법

by 수삼이는코딩중 2023. 1. 20.
728x90
자료형

자료형

c언어는 파이썬과 다르게 변수를 선언할 때 자료형을 먼저 적어줘야 한다.

a=10
b="Korea"
c=1.12345

파이썬에서는 변수를 다음과 같이 정하면, a와 b와 c는 자동적으로 각각 정수, 문자열, 실수 자료형임을 인식하도록 설계되어 있다.

이와 달리 c언어는 변수를 선언할 때 변수가 위치할 메모리를 할당해줘야 하는데 그 메모리가 얼마나 필요한지에 대한 정보가 자료형에 있다.
메모리 : 문자형은 1byte, 정수형은 4bytes, 실수형 중 float은 4bytes, double은 8bytes이다.

/*정수형*/
int a;
a=10;

기본형은 이렇고

int a = 10;

와 같이 줄여써도 된다. (더 편하다)

원시 자료형(흔히 말하는 자료형)

char : 문자형 (string 자료형이 없다)
int : 정수형
float : 실수형
double : 실수형
(void : 자료형이 없다)

<char 자료형 사용>

#include <stdio.h>
int main() {
	char x = 'a';
	printf("%c", x);
	return 0; 
}

결과는 다음과 같다
a
%c : char 자료형 포맷.
printf 할 때 쓰는 것, 파이썬 print함수에서 숫자를 포맷할 때

print(f{"%d"},x)

로 쓰는 것과 비슷하다.

#include <stdio.h>
int main() {
	char x = 65;
	printf("%c", x);
	return 0;
}

결과는 다음과 같다
a

분명히 변수 x에 숫자를 저장했는데 자료형이 char라는 이유로 a라고 출력된다. 우리가 볼 때는 a로 보이지만 컴퓨터는 a를 숫자로 저장하고 있다. 즉 우리가 문자를 데이터에 저장해도 컴퓨터는 숫자인지 문자인지 구분 못한다. 자료형을 보고 구분한다. 따라서 %c를 출력하라고 했기 때문에 65를 char 자료형인 a 로 출력해준다.
(문자에 대응되는 숫자는 ASCII Code 에서 확인가능하다.)

<int와 char 자료형 사이의 변환>

#include <stdio.h>
int main() {
	int x = 65;
	printf("%c\n", x);
	char y = 65;
	printf("%c\n", y);
	char z = 'B';
	printf("%d\n", z);
	return 0;
}

char 자료형과 int 자료형 간 변환이 자유롭다.

#include <stdio.h>
int main() {
	int x = 100;
	printf("10진수로 출력 : %d\n", x);
	printf("8진수로 출력 : %o\n", x);
	printf("16진수로 출력 : %x\n", x);
	return 0;
}

결과는 다음과 같다.
10진수로 출력 : 100
8진수로 출력 : 144
16진수로 출력 : 64

%d : 10진수 출력 포맷
%o : 8진수 출력 포맷
%x : 16진수 출력 포맷

<double 자료형 사용>

#include <stdio.h>
#define MONTHS 12
int main() {
	double monthSalary = 1000.5;
	printf("$ %.2f", monthSalary * MONTHS);
	return 0;
}

결과는 다음과 같다.
$ 12006.00

#define MONTHS 12

MONTHS 라는 상수를 12로 정의한다는 뜻이다.


이진법

기수법

기수법 : 수를 표현하는 법. 예를들면 10(숫자로표현), 십(한글로표현), ten(영어로 표현)
십진법 : 0~9 총 10개의 수에 10의 제곱을 차례로 곱하여서 수를 나타내는 것. (우리가 흔히쓰는 방법)
이진법 : 0~1 총 2개의 수에 2의 제곱을 차례로 곱하여서 수를 나타내는 것. (컴퓨터가 쓰는 방법)
십진법을 이진법으로 나타내는 법 : 몫이 0이 될 때 까지 2로 나눈 나머지를 역순으로 재배치한다.

2 8 ...0
2 4 ...0
2 2 ...0
2 1 ...1
  0  

8=1000

16진법 : 0x0123456789ABCDEF
0x : 16진법임을 알려주는 코드

<십진법을 십육진법으로 나타내는 법>
10진수를 2진수로 바꾼 후에 16진수로 바꾼다.
또는 16진수를 2진수로 바꾼 후에 10진수로 바꾼다.

<16진법과 2진법과 10진법>
0 0000 0
1 0001 1
2 0010 2
3 0011 3
4 0100 4
5 0101 5
6 0110 6
7 0111 7
8 1000 8
9 1001 9
A 1010 10
B 1011 11
C 1100 12
D 1101 13
E 1110 14
F 1111 15

컴퓨터 한 개의 메모리 소자 : bit . 이진수 한자리를 담을 수 있다. 0 또는1.
1byte = 8bit : (2진수) 00000000~11111111 = (10진수) 0~255 = (16진수) 0~0xFF총 256개의 수를 나타낼 수 있다.

컴퓨터는 CPU의 레지스터(작은메모리공간)에 값을 불러놓고 연산을 수행한다.
레지스터란? CPU에서 연산을 수행하기 위해 잠시 값을 써 놓는 부분을 말한다.
워드란? 레지스터의 크기. 컴퓨터 상에서 연산이 실행 되는 최소 단위를 말한다.
32비트 컴퓨터 : 1워드=32bit=4bytes
64비트 컴퓨터 : 1워드=64bit=8bytes

int형에 할당되는 메모리 : 4bytes=32bit : 이진법 숫자 갯수 총32개.
쉽게 말해 칸을 32개 만든다. 각 칸에 0또는1을 넣고, 맨 앞칸은 양수인지 음수인지를 알려주는 숫자가 들어간다.

0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0

와 같이.

<컴퓨터가 음수를 표현하는 방법>
2의 보수 표현 체계 : 비트를 반전시킨 뒤에 1을 더한다.
맨 앞 비트가 1이면 -(음수), 0이면 +(양수)로 읽는다.
음수, 즉 맨 앞 비트가 1 이면 그대로 읽으면 안되고 반드시 양수로 바꾼후 '-'를 붙어야 한다.
쉽게 말해 비트 맨 앞의 숫자가 1이면
1. 아 음수구나.
2. 반전시키자
3. 1을 더하자.
4. 나온 수에 '-'를 붙이자.

참고
오버플로우 : 자료형의 최대범위 보다 큰 수를 대입함으로 발생하는 문제. 데이터 크기 유의.

댓글