1. 자료형의 표현
Byte
- 1 byte == 8bit
- bit는 데이터 처리에서 가장 작은 단위, 0 또는 1중 하나의 상태를 나타냅니다.
- 1byte는 2^8만큼의 상태값을 표현 가능합니다.
음수 표현
- 컴퓨터는 가장 왼쪽에 존재하는 비트가 1인 경우 음수, 0인경우 양수로 인식합니다.
- 가장 왼쪽에 존재하는 비트를 MSB(Most Significant Bit)로 부릅니다. 직역하면 가장 중요한 비트라는 뜻이고 음수 부호 비트를 나타냅니다.
뺄셈의 계산
- 컴퓨터는 뺄셈을 음수의 덧셈으로 표현합니다.
- 예시를 들자면
10 + (-10) = 0
이런식으로 뺄셈을 표현합니다. - 여기서
-10
을 가리키는 이진수에 대해서 예시를 들어보자면. 1byte 기준으로 10을 가리키는 이진수는 0000 1010이므로 0000 1010과 더해서 0이 나오게하는 이진수가-10
이라고 할 수 있습니다. -10
은0000 | 1010
에1111 | 0110
을 더해주면.1 | 0000 | 0000
이므로 이진수의 덧셈 상에서 0을 나타낼 수 있습니다.
2의 보수.
- 어떤 이진수에 대응하는 음수값을 쉽게 찾아내기 위한 방법입니다.
- 이진수의 모든 자리숫자를 반전시키고 여기에 1을 더하면 2의 보수를 얻을 수 있습니다.
- 이 값은 어떤 이진수의 음수값과 동일합니다.
// 이진수 127
01111111
+10000001 // 숫자를 반전시키면 1000000이지만 +1 수행.
---------
100000000 => 더해서 0이됨.
signed, unsigned
- signed와 unsigned는 직역하면 부호있는, 부호없는 이라는 뜻입니다.
- 여기서 지칭하는 부호는 MSB입니다. 즉 음수를 표현하는, 음수를 표현하지 않는 자료형이라는 뜻입니다.
- 기본적으로 자료형은 signed 자료형입니다.
- unsigned 자료형은 음수 표현이 없는 대신 그 범위만큼 양수 표현 범위가 늘어납니다.
2. 정수형 자료형
표현 단위
- 표현의 최소 단위는 1byte(8bit) 입니다
- char(1), short(2), int(4), long(4), long long(8)
값의 표현 범위
- signed 자료형인 경우.
$-2^{byte *8 -1}$ ~ $2^{byte * 8 -1}-1$ - unsigned 자료형인 경우
$0$ ~ $2^{byte * 8}-1$
3. 실수형 자료형
표현 단위
- 표현의 최소 단위는 1byte(8bit)입니다.
- float(4), double(8)
상수 표현
- c++에서는 실수를 상수로 적을 경우 소수점 뒤에 f를 붙이면 float 자료형으로, f를 붙이지 않으면 double 자료형으로 간주합니다.
형 변환의 이해
정수와 실수의 혼합 연산이 일어나는 경우 하나의 자료형으로 형변환을 해주어야 합니다.
각 자료형에 대한 컴퓨터의 표현 방식이 다르기 때문에 혼합 연산의 경우
이유는 정수형과 실수형의 표현 방식이 다르기 때문입니다.
어떤 자료형으로 표현할지를 프로그래머가 정의해주어야 합니다.
실수형의 경우는 부동소수점 방식으로 표현하고, 정수형의 경우는 일반 비트로 표현합니다.
4. 부동 소수점 IEEE-754
- 부호비트 : 맨 앞의 비트가 1이면 음수, 0이면 양수
- 지수부 : 부호가 없는 정수 부분의 8비트를 차지
- 가수부 : 정규화된 이진수 표현, 23비트를 차지.
실수부의 2진수 변환
- 절대값이 1보다 작은 10진수 소수에 2를 곱합니다.
- 2를 곱한 결과는 1을 넘거나 넘지 않을 것입니다.
- 만약 1을 넘었을 경우 결과에서 1을 떼어내고, 아니면 0으로 처리하며 다음 계산을 이어나갑니다.
- 소수점 이하에 아무 숫자도 남지 않을 때까지 곱셈을 반복합니다.
- 이 과정에서 만들어진 결과의 정수 부분(0 또는1)들을 순서대로 쓰면 해당 소수의 2진수 변환 값이 나옵니다.
가수부 정규화
- 정규화는 소수점을 왼쪽으로 이동시켜, 왼쪽에는 1만 남게 만드는 방법을 정규화라고 합니다.
- 정규화를 수행하는 이유는 한정된 공간에 더 많은 수를 표현하기 위해서 사용하는 방법입니다.
지수부 계산
- IEEE-754에서는 양수와 음수를 표현하기 위해 bias라는 개념을 도입합니다.
- 여기서 bias는 실제수(음수는 -127, 양수는 128)에 127을 더한 수라는 개념입니다.
일반 실수의 부동소수점 계산 예시.
양수 8.25와 무한 소수점 계산 예시.
양수 8.25 계산 예시
1. 양수이므로 부호 비트가 0.
2. 실수부의 2진수 변환
25 [0]
25 * 2 = 0.5 [0]
5 * 2 = 1.0 [1] => 뒷자리가 없으므로 계산 종료.
3. 가수부 계산 (정규화)
$8$ => $1000_{2}$, $0.25$ => $0.01_{2}$
$8.25$ => $1000.01_{2}$
$1000.01_{2}$ 정규화를 수행하면
0을 오른쪽으로 옮겨주고 지수를 추가
$1000.01_{2}$ => $1.00001_{2}^{3}$
$1.00001_{2}^{3}$
실제 표현되는 이진수는 0000 | 0100 | 0000 | 0000 | 0000 | 000|
4. 지수부 계산
지수가 3이므로 => 0111 | 1111(bias 127) + 0000 | 0101(3)
=> 1000 | 0010
입니다.
5. 최종 계산
부호 비트 0
지수부 1000 | 0010
가수부 ``0000 | 0100 | 0000 | 0000 | 0000 | 000|`
최종 이진수 표현 0|10000010|00001000000000000000000
양수 8.6 계산
1. 양수이므로 부호 비트가 0
2. 실수부의 2진수 변환
0.6 * 2 = 1.2 [1]
0.2 * 2 = 0.4 [0]
0.4 * 2 = 0.8 [0]
0.8 *2 = 1.6 [ 1]
0.6 * 2 = 1.2 [1]
0.2 * 2 = 0.4 [0]
0.4 * 2 = 0.8 [0]
0.8 *2 = 1.6 [ 1]
실수부가 1001로 반복되는 것을 확인할 수 있음.
3. 가수부 계산 (정규화)
$8$ => $1000_{2}$ / $0.6$ => $0.10011001...{2}$
$1000.10011001.....{2}$
$1.00010011001...._{2}^{3}$
실제 표현되는 이진수 $0001|0011|0011|0011|0011|010$
4. 지수부 계산
지수가 3이므로 => 0111 | 1111(bias 127) + 0000 | 0101(3)
=> 1000 | 0010
입니다.
5. 최종 계산
부호비트 0
지수부 1000 | 0010
가수부 000|1001|1001|1001|1001|1010
최종 표현 01000001000010011001100110011010
IEEE 754 무한소수의 반올림.
이전에 계산한 8.6은 실수부가 무한소수입니다.
가수부는 분명 1001 1001으로 반복되니까 000|1001|1001|1001|1001|1001| 이렇게 끝나야 할 것 같은데 실제 가수부는 000|1001|1001|1001|1001|1010 이렇게 끝났습니다.
IEEE-754는 32bit 단정밀도 표현방식이므로 표현할 수 있는 실수에는 제한이 있습니다.
무한소수의 경우 실수부가 23bit 표현방식을 넘으므로
이런경우 IEEE-754는 일반적으로 짝수 반올림규칙을 사용합니다.
짝수 반올림(round to nearest, ties to even)
반올림하려는 수의 소수부분이 정확히 0.5일 경우 소수부분의 앞 자리 숫자가 짝수인 경우 가장 가까운 작은 정수로 반올림됩니다.
4.5를 반올림하면 4가 됩니다.
5.5를 반올림하면 6이 됩니다.
8.6의 가수부 표현은?
- 8.6의 가수부는
000|1001|1001|1001|1001|1001
로 보여집니다. - 이 때 뒤에도 무한소수가 반복된다고 가정하면
000|1001|1001|1001|1001|1001|1001....
이렇게 표현되게 됩니다. - 마지막 1뒤에 오는 1은 마지막 1의 1/2 = 0.5와 같습니다.
- 그리고 1001이 반복되므로 마지막 1뒤에 오는 숫자들은 마지막 1의 0.5배보다 큽니다.
- 그러므로 반올림이 수행되어서
000|1001|1001|1001|1001|1001
+000|0000|0000|0000|0000|0001
=>000|1001|1001|1001|1001|1010
이 되게 됩니다.
IEEE-754 참고.
5. 문제 풀어보기.
문제 1.
정수형 자료형의 표현범위를 적어주세요.
문제 2.
MSB, unsigned, signed에 대해서 설명해주세요.
문제 3.
형변환의 필요성에 대해서 설명해주세요.
문제 4.
부동 소수점 IEEE-754의 부호비트, 지수부, 가수부에 대해서 설명해주세요.
문제 5.
2.2를 IEEE-754 부동소수점 방식으로 표현해주세요.
'C++' 카테고리의 다른 글
C++ 클래스 (0) | 2024.05.12 |
---|---|
C++ 동적할당 (0) | 2024.05.04 |
C++ 컴파일 과정 (0) | 2024.04.21 |
C++ Const 정확도(Const Correctness) (0) | 2024.04.06 |
C++ 연산자 (0) | 2024.02.28 |