안녕하세요, C 프로그래밍 언어 열네번째 강의입니다.

오늘도 변수, 그 중 실수형 변수를 컴퓨터가 어떻게 저장하는지에 대해 알아보겠습니다.



실수의 정의는 유리수와 무리수를 합친 숫자의 범위를 말합니다.

쉽게 설명하여, 정수를 포함하여 소수점을 가지는 숫자들을 생각하시면 됩니다.

본래 실수는 무한대의 소수점을 가질 수 있습니다.

하지만 컴퓨터가 저장할 수 있는 용량의 한계가 있기 때문에 무한대의 소수점은 생략하겠습니다.



우리는 여태까지 변수를 선언하기 위해서 int를 사용하였습니다.

하지만 int는 지난 강의에서 배웠듯이 정수형 변수를 선언하기 위한 자료형입니다.

하지만 실수형 변수를 선언하기 위해서는 float 혹은 double이라는 자료형을 사용해야합니다.

float와 double이라는 단어는 아래 슬라이드에서 설명드리겠습니다.


float형 변수는 총 32비트의 저장 공간을 가집니다.

double형 변수는 그 2배인 64비트의 저장 공간을 가집니다.

float형보다 double형이 더 많은 범위의 숫자를 표현할 수 있겠죠?



바로, 컴퓨터가 실수를 어떻게 저장하고 있는지 알아보겠습니다.

대부분의 컴퓨터에서는 실수를 효율적으로 저장하기 위해서 부동 소수점이라는 방식을 사용합니다.

부동 소수점은 영어로 floating point이기 때문에 우리는 float라는 이름으로 변수를 선언한겁니다.

부동 소수점 방식은 많은 과학분야에서 사용되며 적은 숫자를 이용해 넓은 범위의 실수를 표현할 수 있습니다.


32비트 중 가장 왼쪽의 비트는 부호를 의미하며, 다음 8비트는 e, 나머지 23비트는 f를 의미합니다.

이 세가지 숫자를 조합하여 매우 넓은 범위의 실수를 표현할 수 있습니다. 



하지만 부호 비트와 f, e를 이용해서 숫자 0을 표현할 수 있을까요?

소수점 부분을 표현하는 f를 이용해서는 0을 만들 수 없습니다.

2의 몇 승을 하던 후자도 절대 0을 만들 수 없습니다.

위의 부동 소수점 방식을 이용해서는 0을 표현할 수 없습니다.


그렇다면 우리는 컴퓨터에서 0을 사용할 수 없을까요?

자주 사용하게 되는 0을 위해 컴퓨터는 모든 비트를 0으로 만든다면 이것을 숫자 0으로 하기로 약속을 하였습니다.

이 숫자는 0이 아니지만 컴퓨터는 0을 표현하기 위해 예외로 처리하였습니다.


이때 문제점은 사칙 연산을 통해 결괏값이 0이 나와야한다면?


애초에 실수 타입을 0으로 초기화한다면 컴퓨터는 모든 비트를 0으로 만들어 0을 표시할 겁니다.

하지만 0이 아닌 두 개의 실수가 있고, 그것을 수식을 통해 연산할 때 문제가 됩니다.

컴퓨터는 두 실수를 정해진 비트와 연산 약속에 따라서만 판단하고 계산합니다.

히지만 그 결괏값이 0인 경우 어떻게 될까요?

컴퓨터는 이 결괏값이 실제로 0인지, 그냥 그에 가까운 숫자인지 판단하지 못하고, 그에 가까운 결괏값을 표현합니다.


하지만 0과 그에 가까운 숫자의 차이가 크지 않음으로 대부분 사용자는 무시하고 넘어가게 되지만, 그것이 오래 쌓이다보면 큰 문제가 되기도 합니다.


이번 시간은 이러한 부동 소수점의 문제점만 인지하고 넘어가시고 혹 나중에 문제가 된다면 다시금 복기하겠습니다.



'Computer Science > C' 카테고리의 다른 글

Chapter 15. 비트 연산자  (0) 2018.05.01
Chapter 13. 정수 표현법  (0) 2018.04.26
Chapter 12. 진법  (0) 2018.04.24
Chapter 11. 연산자 우선순위  (0) 2018.04.19
Chapter 10. 연산자 실습  (0) 2018.04.18


안녕하세요, C 프로그래밍 언어 열세번째 강의입니다.

오늘은 변수, 특히 정수형 변수를 컴퓨터가 어떻게 저장하는지에 대해 알아보겠습니다.



정수를 정의한다면, 자연수 전체와, 그 역원과 0을 말합니다.

아주 간단히 말해, 소숫점이 없는 숫자라 생각하시면 편합니다.

1, 2, 3, ..., 6512, ..., 등 자연수와, 0, 그리고 자연수에 음의 부호를 붙힌 숫자들을 생각하세요.



이전 실습 강의에서 우리는 정수를 컴퓨터에 저장하고 사용하기 위해서 변수의 선언 및 초기화를 하였습니다.

그때 사용하였던 변수 종류는 int였습니다.

int는 Integer의 약자이며, 정수를 뜻합니다.

정수를 저장하고 사용하기 위한 변수 종류입니다.

보통 int만 사용하거나 (signed) int를 작성한다면 양수, 음수를 모두 사용할 수 있습니다.

또한 이 변수 종류는 32비트(bit)의 저장공간을 사용합니다.

바이트(byte)와 비트(bit)에 대해서는 바로 전 강의에서 설명했습니다.



실제로 컴퓨터에 정수형 변수가 저장되는 방식입니다.

지난 시간에 설명했듯이 컴퓨터는 0과 1을 이용한 2진법을 사용합니다.

32비트란 0 혹은 1을 저장할 공간이 32개 있다는 뜻입니다.

1비트씩 32개로 이루어진 정수형 변수 저장공간에서 가장 왼쪽의 비트 하나는 부호를 의미합니다.

가장 왼쪽의 비트가 0이라면 양수, 1이라면 음수를 뜻합니다.

그리고 나머지 31비트는 정수의 크기를 뜻합니다.



32비트는 눈으로 살펴보기에 너무 길기 때문에 간단한 원리를 확인하기 위해 8비트로 대체해보았습니다.

가장 왼쪽의 비트는 0이며, 정수의 크기에는 101이 들어있는 상단의 정수는 +5를 뜻합니다.

2진법 101(2)은 5이기 때문이죠.

가장 왼쪽의 비트는 0이며, 정수의 크기에 111이 들어있는 하단의 정수는 +7를 뜻합니다.

2진법 111(2)은 7이기 때문이죠.


그렇다면 음수는 어떻게 표현할까요?



간단하게 생각하면, 가장 왼쪽의 비트가 정수의 부호를 나타내는 비트라고 언급했습니다.

따라서 -5를 표현하고 싶다면 가장 왼쪽 비트에 음수를 표시하고, 정수의 크기에 5를 넣으면 될까요?



검증하기에 앞서, 5-5=를 해보겠습니다. 5-5=는 5+(-5)=와 같습니다.

5와 -5를 이전 슬라이드에서 계산했듯이 비트로 만들어 덧셈을 해보겠습니다.

윗 슬라이드에서 정한 규칙대로 음수를 정하니, 계산의 결과가 -10이 나왔군요.

5+(-5)=0이 나와야하는데, 잘못된 계산 결과입니다.


컴퓨터는 기본적을으로 덧셈과 2진법밖에 할 줄 아는것이 없습니다.

(뺼셈은 음수로 만들어 더하고, 곱셈도 덧셈을 매우 빠르게 여러번 할뿐이죠.)



컴퓨터는 덧셈 밖에 할 수 없으니, 2의 보수법이란 것을 도입합니다.

이게 왜 음수지? 라는 생각보다는 음수를 표현하는 또 한가지의 규칙이라고 생각하시면 이해가 쉽습니다.


양수를 음수로 만드는 방법 중 하나로, 가장 먼저 모든 0을 1로 바꾸고 모든 1을 0으로 바꿉니다.

그리고 +1을 해줍니다. 그러면 2의 보수법을 이용한 음수로 만들기가 끝났습니다.


우리는 이러한 값을 음수라 말합니다. 같은 방법을 다시 반복하면 다시 양수가 되겠죠.



새로운 음수 규칙으로 만들어진 -5로 5+(-5)을 진행해볼까요.

와, 실제로 결과값이 0이 나왔습니다.


이렇게 컴퓨터는 음수를 저장할 땐, 2의 보수법을 이용하여 음수를 표현합니다.


다음 시간에는 실수를 컴퓨터는 어떻게 표현하는지에 대해 공부하겠습니다.


'Computer Science > C' 카테고리의 다른 글

Chapter 15. 비트 연산자  (0) 2018.05.01
Chapter 14. 실수 표현법  (0) 2018.04.27
Chapter 12. 진법  (0) 2018.04.24
Chapter 11. 연산자 우선순위  (0) 2018.04.19
Chapter 10. 연산자 실습  (0) 2018.04.18


안녕하세요, C 프로그래밍 언어 열두번째 강의입니다.

오늘은 쉬어가는 시간으로 아주 간단한 진법(진수)에 관하여 짚고 넘어가겠습니다.



진법과 관련된 재밌는 인용구입니다. 과연 누구는 웃고 있고, 누구는 웃지 못하고 있나요?

웃지 못하는 당신은 오늘 강의를 집중하셔야합니다.



진법(진수)란 숫자를 세는 법이라고 생각하시면 편합니다.

위의 4가지 뿐만아니라 용도와 목적에 맞게 여러가지 진법을 사용할 수 있습니다.

하지만 컴퓨터프로그래밍에서는 2진법과 8진법, 16진법을 기억하셔야합니다.

10진법은 위 세가지를 이해하기위한 쉬운 수단으로 생각하시면 됩니다.



먼저, 10진법입니다. 저희가 일상 생활에서 흔히 사용하고 있는 숫자 체계로써 한 자리에 0~9를 넣어 원하는 숫자를 만들죠.

10진법을 널리 사용하게 된 큰 이유 중 하나는 우리의 손가락이 10개라서 랍니다.

0~9까지 총 10 종류의 숫자를 가지고 한자리에 0~9 중 하나를 선택해 넣어 숫자를 만듭니다.

너무 쉽죠?



2진법입니다. 중등교과 과정에 나오는 2진법입니다.

10진법이 0~9을 이용한 반면, 2진법은 0과 1을 이용한 숫자 체계입니다.

0과 1로만 모든 숫자를 표현해야합니다.

위 슬라이드에는 표시하지 않았지만, 10진법과 헷갈림을 방지하기 위해 2진법 뒤에는 (2)를 붙여둡시다.

2진법으로 0을 표현하기 위해서는 그냥 0(2)을 쓰면 됩니다.

2진법으로 1을 표현하기 위해서도 그냥 1(2)을 쓰면 됩니다.

2진법으로 2를 표현하고싶지만, 2진법에서는 0과 1밖에 사용하지 못합니다.

때문에 0(2), 1(2) 이후에 한자리 수를 바로 올려버려서 10(2)라고 표현합니다.

즉, 10진법의 2는 2진법의 10(2)와 같습니다.

3을 표현하고 싶다면 11(2), 4을 표현하고 싶다면 자릿수 올림을 통해 100(2)가 되겠죠? 



8진법입니다. 0~7밖에 사용하지 못하는 8진법입니다.

10진법의 7을 8진법에서도 마찬가지로 7(8)로 표현합니다.

하지만 10진법의 8을 8진법에서는 8을 사용할 수 없기 때문에 자릿수를 올립니다.

그렇기에 10진법의 8은 8진법에서 10(8)이 됩니다.

9를 표현하기 위해서는 11(8)이 되고,

10을 표현하기 위해서는 12(8)이 됩니다.



16진법입니다. 2진법과 달리 10진법보다 큰 수네요.

16 종류의 숫자를 이용해 수를 표현하겠네요.

16 종류의 숫자가 있었나요?

우리는 알파벳 A, B, C, D, E, F를 가져와서 사용합니다.

16진법 A는 10진법 10을 의미합니다.

16진법 F는 10진법 15를 의미합니다.

10진법 16을 표현하기 위해서는 자릿수 올림을 하여 10(16)이 됩니다.



왜, 우리는 2진법과 8진법, 16진법을 배울까요.

컴퓨터는 전기신호로 작동되는 기계입니다.

현재 컴퓨터는 매우 단순한 기계로써 전기신호가 있는가? 없는가? 밖에 구별하지 못합니다.

그것이 0 혹은 1이 됩니다.

즉 컴퓨터는 0과 1밖에 인식하지 못하고, 그것을 통해 모든 계산을 합니다.


우리는 0 혹은 1을 비트라고 합니다.

그리고 그 비트 단위 8개가 모이면 바이트라고 하는 단위가 됩니다.


비트 혹은 바이트로 이루어진 컴퓨터 언어는 인간 세계의 2진법 체계와 매우 비슷합니다. 0과 1로만 이루어진 세상이죠.

따라서 저희는 2진법을 숙지해야 컴퓨터와 조금더 친해질 수 있습니다.

하지만 2진법을 쭉 나열을 하면 너무 길어지고 읽기가 불편해집니다.

2진법 4자리수를 모아서보면 8진법으로 표현이 가능합니다.

또한 2진법 8자리수를 모아서보면 16진법으로 표현이 가능합니다.


이것이 바로 우리가 8진법과 16진법을 배우는 이유입니다.



마지막 실습입니다!

직접 그대로 작성해보시고, 출력해보세요.

변수 선언과 초기화 중, 0x의 의미는 뒤에 나오는 숫자체계가 16진법이라는 의미입니다.

즉 0xD3이란 D3이 16진법을 따른다는 의미입니다.

또한 0으로 시작하는 정수는 뒤에 나오는 숫자체계가 8진법이라는 의미입니다.

즉 032이란 32가 8진법을 따른다는 의미입니다.


printf 함수에서 %d 는 기본적으로 10진법으로 정수를 출력하겠다는 의미가 담겨져있습니다.

따라서 첫번째 printf 함수는 인자값으로 받은 16진법 x를 %d 때문에 스스로 10진법으로 바꾸어 출력합니다.

'Computer Science > C' 카테고리의 다른 글

Chapter 14. 실수 표현법  (0) 2018.04.27
Chapter 13. 정수 표현법  (0) 2018.04.26
Chapter 11. 연산자 우선순위  (0) 2018.04.19
Chapter 10. 연산자 실습  (0) 2018.04.18
Chapter 9. 연산자  (0) 2018.04.13

+ Recent posts