자료형이란 데이터가 어떤 형태인지를 설명해주는 역할을 한다.
자료형 (Data Type)의 크기 단위
- 1byte = 8bit, 1KB = 1024byte, 1MB = 1024KB, 1GB = 1024MB, 1TB = 1024GB(=2^40 byte)
- 1bit는 2가지를 표현할 수 있다. -> 8bit(1byte)는 256가지의 상태를 표현할 수 있다. (즉, 2^bit 수)
- 256가지의 경우의 수를 가지고 표현할 수 있는 수의 범위는 ? 0이 포함되므로 255까지 표현할 수 있다.
정수형 자료형
종류 : char(1byte), short(2byte), int(4byte), long(4byte), long long(8byte)
1. 1byte로 양수만 표현
unsigned char c1 = 0;
c1는 1byte 양의 정수를 내포하고 있는 자료형으로 0~255까지 들어갈 수 있다.
- `c1 = 256;`
- 256은 이진수로 표현하면 100000000인데 8칸을 넘어간다. 8칸까지 자르면 00000000이므로 c1 = 0으로 들어간다.
- `c1 = -1;`
- -1은 1과 더했을 때 0이 되는 수이다. 1의 이진수 표현은 00000001이므로 합이 1이 되려면 -1의 이진수 표현은 11111111이다. (왜냐하면 10진수는 각 자리수가 10이 되면 다음 자리수로 넘겨주지만 2진수는 합이 2가 되면 다음 자리수에 1이 넘어가고 해당 자리수의 값은 0이 된다.) 따라서 255가 된다.
2. 1byte로 양수, 음수 둘다 표현
char c2 = 0;
c2는 -128 ~ 0 ~ 127까지 들어갈 수 있다. 맨 앞의 값이 0이면 양수, 1이면 음수로 해석한다.
- `c2 = 255;`
- 255는 이진수로 표현하면 11111111이다. 맨 앞의 값이 1이기 때문에 음수로 해석된다. 11111111 + 00000001(=1) = 100000000(=0)이므로, 11111111는 -1이 된다.
=> c1과 c2는 메모리 공간이 같다. 하지만 동일한 메모리 공간에 동일한 값이 채워졌어도 어떻게 해석하느냐에 따라서 받아들여지는 것이 다르다.
음수 빨리 찾는 법
- 2의 보수법 : 양수를 먼저 이진수로 표현 -> 반전 -> 1더하기 -> 10진법으로 변환
실수형 자료형
종류 : float(4byte), double(8byte)
정수 표현 방식과 실수 표현 방식은 다르다. 실수 표현 방식은 정밀도에 의존한다. 따라서 double 자료형이 float 자료형보다 더 아래의 소수점까지 정확하게 표현이 가능하다.
그렇다면 실수는 0~1 사이에도 무한대의 수가 있는데 어떻게 한정적인 메모리로 실수를 표현할 수 있을까 ? 컴퓨터에서 실수를 표현하는 방식은 "부동소수점"이라는 실수 표현 체계를 따른다.
우선 정수와 실수는 표현하는 방식, 메모리를 다루는 방식 자체가 다르므로 정수와 실수 연산이 혼합되어 있을 때 둘 중 한쪽 방식을 선택해야 한다. (형변환 연산)
// 정수는 정수끼리, 실수는 실수끼리 연산하되, 두 표현방식의 피 연산자가 연산될 경우 명시적으로 변환하자
float f = 10.2415f + float(20);
부동소수점
예를 들어 십진수 21.8125를 정규화된 이진수를 나타낸다고 할 때,
1st : 21을 2진수로 표현한다. (21)_10 = (10101)_2
다음으로 0.1은 10진수 개념에서는 1/10이고 2진수 개념에서는 1/2이다. 0.01은 10진수 개념에서는 1/100이고 2진수 개념에서는 1/4이다. 0.001은 10진수 개념에서는 1/1000이고 2진수 개념에서는 1/8이다.
2nd : 0.8125 = 0.5 + 0.25 + 0.0625이므로 (11010)_2가 된다.
3rd : (21.8125)_10 => (10101.11010)_2 => 왼쪽으로 5칸 => (0.1010111010) * 2^5
4rd : 지수 부분의 5를 2진법으로 바꾸면 (101)_2
따라서 32비트 정규화된 부동소수정수로 나타내면 맨 앞 비트의 부호는 0(양), 지수부 부호는 0(양), 지수부 나머지 6개 비트는 000101, 가수부는 1010111010000...이 된다.
(0_0000101_101011101000...00)_2가 된다. (1비트:부호 _ 7비트 : 지수부 _ 24비트 : 소수점)
이런 방식으로 실수와 가장 근사한 비트 상태를 잡아낸다. 또한 정밀하게 표현되는 타입이 아니다 보니까, 원하는 결과값이 1이 될 때가 있고 안될 때가 있다는 것 주의하기 !
'Programming > C++' 카테고리의 다른 글
[C++] 배열 (0) | 2025.06.01 |
---|---|
[C++] 반복문(for, while) | 함수(w/ 재귀함수) (0) | 2025.06.01 |
[C++] 입출력 (0) | 2025.06.01 |
[C++] 연산자 (w/ if-else, switch, define) (0) | 2025.06.01 |
[C++] 컴퓨터 언어와 운영체제, 그리고 프로그래밍 언어 (2) | 2025.05.31 |