우선 C언어에는 float(4bytes)과 double(8bytes)의 실수 자료형이 있다.
float 자료형을 예로 들면,
다음 그림처럼 4바이트이므로 32비트만큼의 메모리를 가지게 되고
가장 왼쪽 1비트는 부호
그다음 8비트는 지수(몇번 곱할지)
그 나머지 비트들은 소수부를 뜻한다.
(IEEE 754 표준)

예를 들어 보자.
실수 5.75는 컴퓨터가 어떻게 저장할까?
1. 10진수 -> 2진수 변환
정수 부분
5(10) = 101(2)
소수 부분
0.75(10) = 0.11(2)
따라서
5.75(10) = 101.11(2)
2. 정규화 (Normalization)
101.11₂ → 1.0111₂ × 2²
3. IEEE 754 구성
| 구분 | 비트수 |
| 부호(sign) | 1bit |
| 지수(exponent) | 8bit |
| 가수(mantissa) | 23bit |
4. 각 비트 계산
부호 비트
5.75 > 0 이므로 0
지수 비트
IEEE754는 바이어스 127 사용
(지수가 음수 -127일 때를 대비하여 127을 일괄적으로 더해준다.)
| 실제 지수 | 저장 값(실제+127) | 비트 |
| -127 | 0 | 0000 0000 |
| -1 | 126 | 0111 1110 |
| 0 | 127 | 0111 1111 |
| +1 | 128 | 1000 0000 |
| +2 | 129 | 1000 0001 |
| +128 | 255 | 1111 1111 |
→ 저장값 = 실제 지수 + 127 = 2 + 127 = 129
129 = 1000 0001₂
가수 비트
1.0111 (정규화된 값)
앞에 1 언제나 항상 1이므로 저장하지 않고 뒤에만 저장한다.
(남는 공간은 0으로 채운다.)
0111 0000 0000 0000 0000 000
0 | 10000001 | 01110000000000000000000
이렇게 실수 하나를 컴퓨터 표현 방식으로 나타내보았다.
근데 사실!! 가장 중요한 건
컴퓨터가 실수를 표현할 때, 정확한 값으로 표현할 수 없다는 것이다.
이것이 무슨 말이냐면...
컴퓨터는 실수를 2진 분수로만 표현하는데,
대부분의 10진 소수는 2진 소수만으로 표현이 안된다.
0.1 = 1/16(0.125) + 1/32(0.00625) + ....
불가능!!!
그래서 실제로는 다음처럼 저장 된다.
| 숫자 | 실제 저장값(근사) |
| 0.1 | 0.10000000149011612 |
| 0.2 | 0.20000000298023224 |
| 0.3 | 0.30000001192092896 |
이걸 꼭 기억하고 프로그램을 짜자-!---!!!
| [CS기초] [C언어] 정수 자료형과 실수 자료형 (0) | 2025.11.29 |
|---|---|
| [CS기초] [C언어] 변수 (0) | 2025.11.28 |
| [CS기초] [C언어] 컴퓨터의 음수 표현 (2의 보수법) (0) | 2025.11.27 |
| [CS기초] [C언어] 비트(bit)와 정수 표현 (0) | 2025.11.27 |
| 나의 첫번째 C++ 프로그램 (2) | 2024.02.13 |