본문 바로가기

공통

자료형과 실수 오차

우리는 쉽게 자료형 이라는 말을 많이 듣게 될 것입니다.

여기서 '자료형' 이라는 것을 오늘 배워볼까 합니다

이번강좌는 되게 중요한 개념이니 꼭 외워 두셔야 합니다!

자료형이란 쉽게말해

우리가

1은 정수

1.24는 실수

"일점이사"는 문자열

"A"는 문자

1은 정수

1.24는 실수

"일점이사"는 문자열

"A"는 문자

라고 하는것 같이

프로그램에게 이 기능은 이런 값을 가지고있어! 라거나

이런 값을 나한테 돌려줘! 라는 뜻입니다

자료형에 어떤 것들이 있는지 알아볼까요?

자료형 타입 크기 발음 표현가능 범위
int 정수형 4바이트 인트 -2147483648 ~ 2147483647
char 문자형 1바이트 캐릭터 -128 ~ 127
long 정수형 4바이트 -2147483648 ~ 2147483647
long long 정수형 8바이트 롱 롱 -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
float 실수형 4바이트 플롯 3.4E-38(-3.4*10^38) ~ 3.4E+38(3.4*10^38) (7digits)
double 실수형 8바이트 더블 1.79E-308(-1.79*10^308) ~ 1.79E+308(1.79*10^308) (15digits)
long double 실수형 8바이트 롱 더블 1.79E-308(-1.79*10^308) ~ 1.79E+308(1.79*10^308) (15digits)
void 공허형 0바이트 보이드 값 지정 불가

더 있지만 이정도로 요약할게요

자 그럼 정수형 문자형 실수형 이런말을 대충 알겠는데

바이트란 뭘까요?

컴퓨터는 우리가 생각하는 10진수의 수와 달리 2진수라는 수를 사용합니다

우리가 아무리 영어로 프로그래밍을 했어도 컴파일을 시키면

컴파일러가 자동으로 다 숫자로 바꿉니다 2진법으로 말이죠

2진법이란 우리가 사용하는 10진법이 0123456789 총 10개의 숫자로

이뤄진 수라면 2진법은 0과 1로만 이뤄진 수입니다

우리가 9까지 센 이후 다음의 숫자를 1과 0을 사용해서

10의 자리숫자를 1 올리고 1의자리숫자를 다시 0으로 바꿔서

10이라 쓰고 '십' 이라고 읽는 것 처럼

 

2진수는

0 1 하고 2를 모르므로

10의자리숫자를 1 올리고 1의자리숫자를 다시 0으로 바꿉니다

쉽게 0부터 5까지 2진수로 세어보자면

 

0, 1, 10, 11, 100, 101

이런식으로 돼서 5는 2진수로 101이겠네요 이해되셨나요??

 

자 갑자기 2진수로 넘어왔어요! 왤까요?

바이트랑 관련이 있기 때문입니다

 

바이트를 알기 위해선 비트를 알아야하는데요

우리가 2진수로 표현한 숫자중 딱 한개를 비트(bit)! 라고 부릅니다

우리가 숫자 5를 2진수로 표현해서 101이라고 했다면

5의 첫번째 비트는 1, 두번째 비트는 0, 세번째 비트는 1이 되는거죠

그리고 이 비트가 8개 모이면 바이트(byte) 라고 부릅니다!

 

자 그럼 int형이 4바이트라고 했죠? 저기에 4 바이트 라는 말은

저 자료형 하나에 4바이트 이하의 값을 넣을수 있다 라는 뜻입니다

 

그럼 4바이트면 8 * 4 해서 36이니까 36비트네요!

그럼 최댓값은

11111111 11111111 11111111 11111111

일거고 10진수로 하면 4,294,967,295 겠네요!

엥? 근데 저기 최댓값은 2,147,483,647라고 적혀있는데요?

나머지는 어디간거죠..라고 하실수 있습니다

우선 말씀드리자면 모든 숫자의 맨앞 1비트는

'부호 비트'라고 부릅니다 값이 아닌 +인지 -인지 정보를 포함하는 비트죠

예를들어서

5를 2진수로 표현하면

00000101 이자만

-5를 2진수로 표현하면

11111011 이 됩니다

 

왤까요?

-5 즉, 음수는 표현방식이 조금 다른데요

우선 -5를 표현하고싶다면

5를 2진수로 만듭니다

부호비트를 제외하면 0000101이겠네요!

이제 여기서 0은 1로, 1은 0으로 바꿔줍니다

1111010이 되겠네요! 그리고 여기서 마지막 비트에 1을 더해줍니다

1111011이 되고! 이제 부호비트는 양수라면 0, 음수라면 1이므로 1을 추가시켜주면

11111011이 되고 이는 10진수로 -5가 되는겁니다.

 

그래서 값을 표현 가능한 비트는 부호비트를 제외한 4바이트 즉 35비트가 되고

최솟값은 -2,147,483,648, 최댓값은 2,147,483,647이 되는겁니다.

 

 

 

자 그럼 실수로 넘어갈게요

실수는 더 어려우니까 꼭 참고하세요 매우매우 중요한 부분이 나옵니다!

 

자 우선 제가 0.01이라는 실수를 1000번 더한 수를 보여드리겠습니다.

에이 10이라구 너무 쉽다구요? 과연 그럴까요?

엥?? 프로그램이 바보인가? 왜 99.999046 이라고 뜨지? 코드 잘못 치신것같은데요? 하실수도 있습니다.

하지만 이 결과는 '정상'입니다. 그 이유를 알아볼까요?

 

우선 프로그램이 실수를 표현하는 방식을 알아 볼 필요가 있는데요!

float형으로 예를 들어보겠습니다

 

float 형은 4바이트입니다. 그럼 2바이트 2바이트 나눠서

2바이트는 정수부분, 2바이트는 소수부분을 나타내면 되겠네요?

아뇨.. 그렇게 한다면 간단하겠지만 아쉽게도 너무 적은 양의 데이터밖에

담을 수 없게됩니다... 그래서 사용한 방법이 E 표기법 이라는 방법인데요!

 

지수표기법 이라고도 하는 이 방법은

부호비트를 제외한 나머지 비트를 반으로 나눠서

앞에 반은 소수점을 표현하고 뒤에 반은

앞에 반에 나온 값에 곱할 값을 표현합니다

 

쉽게 설명하자면

135.482를 표현하고 싶다면

1.35482에서 35482를 앞에 절반비트에서 표현하고

1.35482가 135.482가 돼야하므로

뒤에 절반 비트는 1.35482에 곱해질 100을 표현하는겁니다.

 

이렇게하면 훨씬 많은 양의 데이터를 표현할수있겠네요!

 

단! 가장 큰 문제점은 정확성입니다. 이러한 지수 표기법은

정확성이 떨어지는데요!

한가지의 소수점이 있을때는 극 소량의 오차만 포함해서

오차가 크게 나지 않습니다만

 

아까 제가 한 방법처럼 0.01을 1000번 연속해서 더해주면

그 오차가 쌓이고 쌓여 100이 아닌

99.999046이라는 근접하지만 정확하지 않은 값이 나오게 됩니다.

 

이 점 매우 중요하니 꼭 꼭 꼭 외워두세요!

 

 

자 그럼이번엔 문자 표현 방식으로 넘어가겠습니다

문자란 우리가 흔히 아는 "ABCD" 이런걸까요?

아니요, 이런것은 문자와 문자가 모인 '문자열'이라는것이구요

'문자'는 저 중에서 한개 'A' 또는 'D'와 같이 한개의 값을 문자 라고 부릅니다.

근데 프로그램은 숫자밖에 모른다며요! 문자를 어떻게 아나요!?

맞습니다, 컴퓨터는 오로지 0과 1밖에 모릅니다.

그래서 문자도 숫자로 표현합니다

 

아스키코드(ASCII Code)라는 코드가 존재하는데요

이 코드는 문자를 숫자코드로 정해놓은것이라고 보면 됩니다

아스키 코드로 A는 65, B는 66, C는 67

이런식으로 순차적으로 정의되어 있고

문자형 자료형인 char에다가 65를 주었다면

'A'라고 판별하게 됩니다.

소문자와 대문자 아스키 코드는 서로 다르니 주의해주세요!

 

자 그럼 자료형과 실수 오차에대한 설명을 마치도록 하겠습니다.

중요한 내용이니만큼 충분히 읽어보시길 권장할게요!

'공통' 카테고리의 다른 글

버퍼란?  (0) 2019.07.19
주석  (0) 2019.06.26
프로그래밍 표기법  (0) 2019.06.26
전역변수와 지역변수  (0) 2019.06.26
연산자  (0) 2019.06.24