Notice
Recent Posts
Recent Comments
Link
«   2025/09   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Archives
Today
Total
관리 메뉴

우주코딩

부동소수점을 2진수로 저장하기, 문자를 2진수로 저장하기 본문

본격 코딩 전 기초

부동소수점을 2진수로 저장하기, 문자를 2진수로 저장하기

우주코딩 2021. 7. 6. 18:06

*부동소수점 -> 2진수 규칙

IEEE 754 명세에 따라 2진수로 전환한다.

모든 값들은 다 숫자 = 정수 = 2진수로 바꿀 수 있다면 저장할 수 있다.

12.375

12를 2진수로 1100

0.375 *2 = 0.750 => 일단 소수점 앞 0을 기록
0.750 * 2 = 1.500 = 앞의 1을 뺀다
0.500 * 2 = 1.000 = 1
=> 0.011

더한다
1100.011 
항상 왼쪽에 숫자 한개만 남겨두어야한다
#.### 

1.100 001 * 2의 3승 (2진수의 정규화)

 |
1100.011  같은 값

32bit(4byte) 메모리라면
부호비트( + 는 0  - 는 1) , 지수부 (8bit), 가수부(23bit)

지수부는 express -k에 따라 127을 더해 저장한다
가수부는 부호 절대값 sign-Magnitude 그대로 저장한다

같은 수를 저장하더라도 float, double
 몇 바이트에 저장하느냐에 따라 진수 표현이 다르다.

부동소수점이라도 정규화할 때 2진수로 딱 떨어지지 않는 경우가 있다.
그래서 부동소수점은 정수와 다르게 정확하게 2진수로 변환할 수 없는 경우가 있따.
메모리에 정확하게 저장되지 않을 수 있다.

0.0000 .....1 의 오차가 있을 수 있다.

4byte(float) 부동소수점의 유효자릿수는 소수점을 뺀 후 7자리 숫자까지 정상적으로 저장된다.
유효자리가 7자리를 넘어가면 잘려서 저장 될 수 있다.


8byte(double) 부동소수점의 유효자릿수는 소수점을 뺀 후 16자리 숫자까지 정상적으로 저장된다.
유효자리가 16자리를 넘어가면 잘려서 저장 될 수 있다.

그래서 32비트를 단정도라고 부르고 single-precision이라고 부르고 64비트는 두배 정밀하게 값을 저장해서 배정도 double-precision이라고 부른다,

*부동소수점과 메모리크기
부동소수점은 정확하게 최대 최소를 정할 수 없다.
32bit 메모리 4byte는 부호비트, 지수부, 가수부로 구분되는데 = 2진수로 전환하기 때문에
- ? ~ + ? 인지 결정할 수 없다

결론
IEEE 754 규칙에 따라 2진수로 변환하기 때문에 소수점 이상/이하 자릿수를 명시 할 수 없다.
소수점을 제외한 숫자의 자릿수로 가능범위를 표현한다.
 =' 유효자릿수'라고 부른다.
 
유효자릿수 범위의 부동소수점을 2진수로 변환하면 최소의 오차로 값을 저장할 수 있다.

*지수부, 가수부, 64비트

12.375를 64비트 메모리에 담기
[1:부호비트][11:지수부][52:가수부] = 64비트
부호비트(1) = 0
지수부(11) = 3 + (2**(11-1) - 1) = 3 + (1024 - 1) = 3 + 1023 = 1026
              = 100_0000_0010
가수부(52) = 100011
예) 0_10000000010_1000110000000000000000000000000000000000000000000000
//  = 01000000_00101000_11000000_00000000_00000000_00000000_00000000_00000000
//  = 40_28_c0_00_00_00_00_00(16진수)

 

 

*문자 -> 2진수
1)ASCII (7bit)
A = 100 0001
B = 100 0010
C = 100 0011
a = 110 0001
? = 011 1111
공백 = 010 0000

문제는 미국식이라 유럽문자를 쓸 수 없습니다.

국제표준 규칙을 만들어 
2)ISO-8859-x (8bit)
ASCII 문자 + 유럽 문자
한글 저장 못함

3)Euc-KR (16bit) 최대 65536자
한글 2350자 + 알파
영어는 ISO-8859-1 사용
현대 통용되는 한글 음절 11172자를 모두 표현할 수 없다.
ex)윈도우 3.1까지 똠,똡은 정의가 안되어있어서 표현할 수 없었다
완성된 문자에 대해 2진수를 정의해서 완성형이라고 부른다.

4)조합형(16bit) 
모든 한글표현 가능 36,000자 사용가능
국제표준은 아니다. 그래서 안쓴다. 아래아 한글(HWP 에디터)에서만 쓰인다.

초성;  ㄱ ㄲ ㄴ ㄷ ㄸ ㄹ ...  =>5bit사용
중성; ㅏ ㅐㅑ ㅒ ㅓ ...  =>5bit 사용 
종성; => ㄱ ㄲ ㄳ ㄴ ㄵ ㄶ ㄷ ... => 5bit 사용

관공서는 모든 문자를 저장해야하기 때문에 아래아 한글을 씁니다.
전세계 시장 90퍼센트에서 아래아 한글을 사용했고 그 여파로 MS949 등장

5)MS949 (CP949) (16bit)
=EUCKR(2350자 + ) + 알파
기존 EUC-KR은 그대로 사용하고 문자 규칙을 추가한다
출판 업계에서 유통되고있는 문자를 대부분 지원한다.

6)Unicode UTF-16 (16bit)
영어 대,소문자 
숫자
특수기호 모두 2byte로 표현
한글은 현대 한글 음절 11172자를 새로 정의 -> 기존 규칙과 호환되지 않는다.
Java에서 문자를 다룰 때 이 규칙을 사용합니다.

알파벳이 2바이트를 차지하는 것이 마음에 들지 않았다.
기존 영어 문서와 호환이 되지 않았다

영어를 그대로 ISO8859-x로 쓰도록 규칙을 바꿉니다.

7) UTF-8 (8 ~ 32 bit - 1byte ~ 4byte) 
Unicode 변형 포맷이라고 부릅니다
Unicode (Universial  Character Set) Transformation Format
기존의 ASCII 규칙을 그대로 사용하기 위해 만든 규칙입니다.
이전에 작성한 영어 문서를 그대로 사용할 수 있다.

0000 ~ 007f (ASCII) = 그대로 1byte 사용
0080 ~ 07ff  = 110xxxxx 10xxxxxx (2byte) - 유럽문자
0800 ~ ffff = 1110xxxx 10xx xxxx 10xx xxxx (3byte) - 한글 등
10000 ~ ㅡ = 4byte

예) 가
ms949(EUC-KR + 알파) : B0A1 (2byte)
조합형 : 8861 (2byte)
Unicode (UTF-16) : AC00 (2byte)
2진수로 변환 = 1010 1100 0000 0000
UTF-8 : 1110 1010 1011 0000 1000 0000

 

*문자 - > 2진수 규칙
character set(문자집합) -> 문자를 2진수로 바꾸는 규칙
아스키, iso, euc-kr, 조합형, ms949, utf-16, utf-8

* javac -encoding UTF-8 Hello.java
javac.exe에서 ms949로 저장했다면 Hello.java 를 컴파일 할 때 UTF-8로 인코딩한다.
소스코드는 무조건 utf-8로 저장해야한다. 
많은 개발자들이 맥을 사용한다. 

Comments