우주코딩
부동소수점을 2진수로 저장하기, 문자를 2진수로 저장하기 본문
*부동소수점 -> 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로 저장해야한다.
많은 개발자들이 맥을 사용한다.
'본격 코딩 전 기초' 카테고리의 다른 글
값이란 무엇(1), 값과 메모리크기 (0) | 2021.07.05 |
---|---|
함수,클래스,패키지, javadoc 만들기, eclipse에서 프로젝트 import하기 조건, Gradle이용하여 eclipse 관련 프로그램 만들기 (0) | 2021.07.02 |
프로그래밍 언어와 인터프리터, Java 프로그래밍, 어플리케이션과 프로젝트 (0) | 2021.06.30 |
본격 코딩 준비하기 / 프로그래밍 - 기계어와 OS (0) | 2021.06.29 |
소프트웨어란? / 웹 어플리케이션 개발의 종류/ git 기본 설정, git 저장소 활용하기 (0) | 2021.06.29 |