Lecture 1
프로그래밍에 관한 이야기를 아주 쉽게 풀어가는 과정.
처음 오프닝은 위의 숫자들이 컴퓨터의 CPU를 거쳤을 때 어떻게 변환이 되는지 보여주면서 시작한다.
위의 2진수들의 나열은 CPU 연산을 거쳐 위의 글자와 같이 변환이 가능하다.
(한 5분정도 이전 시간의 내용을 복습한다)
지난 번 봤던 pseudocode를 보자. 언듯 보기에는 모두 이해할 수 있는 문구들이지만 이는 사람이기 때문에 대략적으로 알아 듣는 것이다. 컴퓨터는 middle of phone book 같은 추상적인 개념은 이해하지 못한다. 따라서 프로그래밍에서는 컴퓨터가 이해할 수 있도록 아주 정확한 명령을 기입해야 하는 것이다.
우리가 정확하다고 생각한 개념조차 추상적이라는 것을 보여주는 예시로 샌드위치를 만들어 먹는 명령을 수행하는 장면이다. 잼을 바른다, 빵을 덮는다 등등 같은 명령이라도 사람마다 다른 행동을 하는 것을 관찰할 수 있다.
이제 저번에 봤던 Scratch라는 프로그램과 C라는 프로그래밍 언어를 비교/대조 하며 진행한다. (Scratch는 S로 C는 C로 기록하겠다)
위는 'hello, world'를 출력할 때의 두가지 언어의 구조적 차이점을 보여준다.
S에서 hello, world를 출력하는 방식을 C에서 동일하게 구현하기 위해 한단계씩 비교한 사진이다. Say라는 명령은 무언가를 print를 한다는 것이고 이는 printf라는 함수로써 소환할 수 있다. 그리고 'hello, world'를 출력하고 싶으니 S에서는 단순히 'hello, world'를 입력했다면 C에서는 "hello, world "를 입력하나 뒤에 \n를 입력하게 된다.
(\n 은 개행문자로 어떠한 문자열이 출력될 때 이 문자 뒤의 내용은 다음줄에서 출력된다)
이번에는 counter라는 변수를 1씩 증가시키는 함수를 구현하는 방법을 비교한다. S에서는 위와 같은 모습으로 간단히 구현가능하며 C에서는 우측과 같은 방식으로 구현 가능하다. 우측의 3가지 방식들은 모두 같은 의미를 지니며 물론 가장 간단한 방법인 아래쪽 표현이 바람직하겠다.
조건문으로 확장해서 x, y라는 변수두개를 비교해서 어떤것이 큰지 알려주는 내용인데 S에서 표현된 방식과 동일하게 C에서도 위와 같이 적을 수 있다.
하지만 크거나 작지않으면 같을 수 밖에 없기 때문에 마지막 조건은 필요없게 된다. 따라서 else문 뒤에 if문은 삭제해도 무관한 것을 알 수 있다. (위 2가지 조건 불만족 시 무조건 출력)
무한정 'hello, world'를 출력하는 모습이다. 위와 같이 while문으로 간단히 코딩할 수 있으며,
만약 위와 같이 50번만 반복하고 싶다면 for문을 통해 counter인 i를 선언하여 50번 반복 할 수 있도록 한다. for문안의 내용은 (초기식, 조건식, 변화식)이다.
이번에는 좀 더 interactive한 코드인데 S에서 구현된 내용을 보면 'What's your name?'이라는 질문을 주고 대답을 받으면 이를 'hello, [name]'으로 출력하는 간단한 코드이다. C에서는 위와 같이 구현할 수 있으며 실제로는 CS50.h를 import해야한다. 따라서 answer이라는 변수의 type은 string이 되며 get_string이라는 함수를 통해 문자열을 받을 수 있게 된다.
또한 printf를 통해 출력할 때 어떠한 문자열을 출력할 때는 %s를 통해 parameter로 지정하고 여기에 할당되는 내용은 answer가 된다.
이제까지 봐왔던 C언어로 구현된 코드는 source code에 해당하고 컴퓨터가 이해하는 01011000110101110등과 같은 내용은 machine code라고 한다. 이 둘간에 변환자가 필요한데 이를 compiler라고 칭한다.
위는 CS50 Sandbox라고 하는 programming interface이다 굉장히 간단하게 원하는 언어로 프로그래밍을해서 결과를 즉각적으로 볼 수 있는 툴이다. 해당 강좌에서 숙제를 해결할 때 주로 활용하게 하기 위해 만든 것같다.
이제 hello.c라는 sourcecode를 machinecode로 변환하는 과정을 보여주는데 위의 명령어처럼 'clang -o hello hello.c'라고 입력하게 되면 마치 아무일도 일어나지 않은 것처럼 보이겠지만 이는 잘 변환이 되었음을 말한다. C언어로 작성된 hello.c라는 sourcecode가 hello라는 이름으로 프로그램이 output으로 나오게 되는 것이다.(만약 문제가 발생하면 빨간 error들이 나타나게 된다.) 이에 machinecode로 잘 변환이 되어 컴퓨터가 실행할 수 있는 상태가 되었기 때문에 './hello'라고 입력해주면 'hello, world'라고 잘 출력이 되는 것을 확인할 수 있다.
이 단계에서는 make라는 명령어를 사용하는 방법을 알려주고 이때 선제조건은 cs50.h파일을 include하는 것이다. sourcecode를 machinecode로 쉽게 변환할 수 있도록 만든 명령어이니 이 강좌를 수강하는 동안은 잘 활용할 수 있을 듯 하다.
이번에는 사용자로부터 이름을 받아 인사하는 프로그램을 만드는 방법을 보여준다. get_string을 통해 input을 받아 string type의 name 변수에 저장하고 이를 printf를 통해 'hello, [name]'을 출력하는 방식이다.
Terminal에서 'make hello'를 통해 자동적으로 C언어로 작성한 sourcecode가 machinecode로 변환을 시도하고 완료가 되면 './hello'라는 실행명령을 통해 작성한 프로그램이 구동되는 것을 볼 수 있다.
위에서 작성했던 방법처럼 저 대학원생들에게 각각 get_string, printf 함수의 역할을 주고 동작하도록 했다. 굉장히 확실하고 쉽게 이해할 수 있는 방법이었다.
이번에는 숫자를 입력받아 출력하는 방식에 대한 설명이며 이때는 get_string 대신 get_int를 사용하였고 이때 type은 int로 선언하게 된다. 출력시에도 %s대신 %i가 들어서서 출력할 수 있도록 한다.
float형식도 마찬가지로 진행하였다.
이번에는 사칙연산(+modulo)에 대해 integer type으로 진행하였을 때 결과를 지켜보았고,
(modulo는 나머지연산자라고 어떤 수를 다른 수로 나눴을 때 나머지가 얼마인지 출력한다)
x가 2, y가 10일 때 대부분의 결과들은 정상적으로 출력되었지만 나누기(/)만 비정상적으로 결과값이 나온것을 알 수 있다. '0.2'이어야 하는데 왜 0이 되었으며 남은 '.2'는 어디로 갔는가에 대한 답변은 다음과 같다. int type은 정수형이기 때문에 소수점자리의 정보들은 없어지게 된다. 따라서 소수점 이하의 정보를 담고 싶다면 float type으로 데이터를 저장해야 하는 것이다.
float type으로 modulo만 계산했을 때 화면이다. Default로 소수점 6번째 자리까지 나타나는 것을 알 수 있다.
위는 %f로 float type의 데이터를 받았던 것을 %.50f로 소수점 50번째자리까지 표기하도록 한 상태인데 결과값이 뭔가 이상한 것을 볼 수 있다. 정상적으로 라면 '2/10'은 소수점이 2개건 10개건 상관없이 0.20, 0.2000000000로 두 값은 같아야 한다. 하지만 실제로는 그렇지 않음을 알 수 있는데 이유는 다음과 같다.
컴퓨터를 분해해본 사람은 누구나 아는 RAM(Random Access Memory)이다. Hard disk와 다르게 임시로 정보를 저장하는 보조기억장치이다. 위와 같이 거의 무한한 정보를 담기에는 hardware는 유한한 공간을 가지고 있다. 따라서 위와 같이 어느 정도의 정확성을 초과한 데이터를 요구하게 되면 쓰레기값으로 차게된 정보가 반환된다.
이는 사소해보이지만 아주 큰 문제를 초래하게 될 수도 있다. 로켓 발사라던지 우주선 비행과 같이 아주 정밀하고 오차가 없어야 하는 상황에서 이 오차들이 누적이 되어 큰 사고의 원인이 되는 결과를 빚는다.
그래서 float type 대신 double type으로 변환하면 더욱 정확하게 값을 얻어낼 수는 있지만 여전히 오차는 존재하는 것을 알 수 있다. (float 소수점 8번째부터 오차, double 소수점 16번째부터 오차)
위에서 언급된 사소한 오차로 인해 발생할 수 있는 가장 간단한 예로 비교연산자(==)를 사용했을 때를 예시로 보여준다. 물론 여기서는 소수점 자리를 과도하게 가져가지 않음으로 정상적으로 동작하는 프로그램으로 구현하였다.
다음은 cough라는 프로그램을 개발하는 모습으로 'cough0.c'에서는 hardcoding으로 printf를 3번 반복함으로 구현하였다면 'cough1.c'에서는 for문을 통해 더욱 효율적인 코드로 바꾼 것을 확인 할 수 있다.
'cough2.c'에서는 cough라는 함수를 만들어 단순히 printf로 매번 사용하지 않고 함수만 호출함으로 동작하도록 바꾼 모습이다. 이때 주의점은 main함수 밑에 cough함수를 선언하고 정의하면 cough라는 것을 찾지 못했다라고 에러가 나타나게 되는데 이는 main함수 위에서 cough라는 함수가 있다라고만 선언해주면 쉽게 해결된다.
'cough3.c'에서는 cough함수가 딱히 input parameter가 없이도 구동이 되었지만 횟수를 input value로 입력하여 입력한 횟수만큼 구동되도록 변환했을 때 모습이다.
여기는 양수만 입력받도록 하는 함수를 구현한 모습인데 do-while문이라는 다른 형식의 함수를 사용한 모습이다. while문과의 차이점은 while문은 먼저 조건을 확인 후 실행이 되지만 do-while문은 먼저 실행 후 조건을 확인하게 된다.
이번에는 overflow라는 개념에 대한 설명이다. 위와 같이 데이터에 3자리만 저장할 수 있는 공간이 있다고 할 때 값이 999이고 1을 더하면,
1000이 되어야 하지만 실제 공간은 3칸이기 때문에 1000이라는 값이,
000이 된다. 마치 초기화 된 것처럼. 이 것을 overflow현상이라고 한다.
이를 다시 컴퓨터들의 숫자 2진법으로 보자. 똑같이 각 자리에 1이 들어서있고 여기에 1을 더하면,
1000이 아닌,
000이 된다.
정확히는 integer overflow라고 부른다.
여기 한 게임이 있는 게임에서 얻을 수 있는 코인의 Max값이 4 billion이라고 한다. 이는 32bits가 코인의 자릿수인데 이를 통해 최대로 카운트할 수 있는 값이 위와 같다고 한다.
Overflow를 보여주는 코드이며 중간에 '//'는 주석처리를 하는 문자이다. 해당 프로그램은 시작값을 1로 하여 2배씩 값을 증가시키고 출력하게 하는 것이다. overflow가 일어 날때까지. 값을 출력할 때 sleep함수를 통해 1초씩 쉬는 것을 알 수 있다.
실행 화면이며 값이 꽤 커졌을 때 어느 순간 overflow가 일어나서 값이 0으로 초기화 된 듯한 모습이다.
이는 예전에 컴퓨터에서 1999년에서 2000년으로 넘어갈때 2000년이 아닌 1900년으로 표기한 문제와도 연관이 있다. 이전에는 무조건 20세기(1900년대)였기 때문에 앞에 19는 default이고 뒤에 두자리만 연산하면 되었지만 21세기(2000년대)로 넘어갈 때 상황이 바뀌었던 것이다. 따라서 이는 추후에 수정되었다.
또 다른 사례로는 보잉787 비행기의 고장 케이스였는데 어떤 이유로 인해 비행기가 248일 동안 전원이 꺼지지 않고 켜져있었는데 이 때 발전기의 안전 알람이 해제되었다고 한다. 원래는 주기적으로 on-off를 통해 내부 카운터가 초기화 되었어야 하는데 그러지 못하여 계속 켜져있는 동안 카운터값이 증가했고 248일 째 되던날 overflow가 발생하여 안전 알람이 해제되어 문제를 일으켰다고 한다.
이번에는 underflow에 대한 설명인데 위와 같이 값들이 모두 0으로 차있을 때 1을 빼게 되면
-1이 아닌 값이 모두 1로 차서 마치 최대값이 된 것처럼 보일 수 있게 된다.
이에 대한 예시로는 예전에 나왔던 버전의 Civilization이라는 게임이다. 간디의 호전도(aggressiveness level)은 1로 낮은 수치 였지만 위와 같이 민주주의를 도입하게 되면 호전도가 2 감소하게 되는 이는 underflow를 일으켜 평화주의 간디가 전쟁광이 되어버린다는...
이번 강의도 굉장히 유익하고 쉽고 재밌는 예시까지 있어서 즐거웠다. 이제 숙제를 해봐야 겠지만.
프로그래밍에 관한 이야기를 아주 쉽게 풀어가는 과정.
처음 오프닝은 위의 숫자들이 컴퓨터의 CPU를 거쳤을 때 어떻게 변환이 되는지 보여주면서 시작한다.
위의 2진수들의 나열은 CPU 연산을 거쳐 위의 글자와 같이 변환이 가능하다.
(한 5분정도 이전 시간의 내용을 복습한다)
지난 번 봤던 pseudocode를 보자. 언듯 보기에는 모두 이해할 수 있는 문구들이지만 이는 사람이기 때문에 대략적으로 알아 듣는 것이다. 컴퓨터는 middle of phone book 같은 추상적인 개념은 이해하지 못한다. 따라서 프로그래밍에서는 컴퓨터가 이해할 수 있도록 아주 정확한 명령을 기입해야 하는 것이다.
우리가 정확하다고 생각한 개념조차 추상적이라는 것을 보여주는 예시로 샌드위치를 만들어 먹는 명령을 수행하는 장면이다. 잼을 바른다, 빵을 덮는다 등등 같은 명령이라도 사람마다 다른 행동을 하는 것을 관찰할 수 있다.
이제 저번에 봤던 Scratch라는 프로그램과 C라는 프로그래밍 언어를 비교/대조 하며 진행한다. (Scratch는 S로 C는 C로 기록하겠다)
위는 'hello, world'를 출력할 때의 두가지 언어의 구조적 차이점을 보여준다.
S에서 hello, world를 출력하는 방식을 C에서 동일하게 구현하기 위해 한단계씩 비교한 사진이다. Say라는 명령은 무언가를 print를 한다는 것이고 이는 printf라는 함수로써 소환할 수 있다. 그리고 'hello, world'를 출력하고 싶으니 S에서는 단순히 'hello, world'를 입력했다면 C에서는 "hello, world "를 입력하나 뒤에 \n를 입력하게 된다.
(\n 은 개행문자로 어떠한 문자열이 출력될 때 이 문자 뒤의 내용은 다음줄에서 출력된다)
이번에는 counter라는 변수를 1씩 증가시키는 함수를 구현하는 방법을 비교한다. S에서는 위와 같은 모습으로 간단히 구현가능하며 C에서는 우측과 같은 방식으로 구현 가능하다. 우측의 3가지 방식들은 모두 같은 의미를 지니며 물론 가장 간단한 방법인 아래쪽 표현이 바람직하겠다.
조건문으로 확장해서 x, y라는 변수두개를 비교해서 어떤것이 큰지 알려주는 내용인데 S에서 표현된 방식과 동일하게 C에서도 위와 같이 적을 수 있다.
하지만 크거나 작지않으면 같을 수 밖에 없기 때문에 마지막 조건은 필요없게 된다. 따라서 else문 뒤에 if문은 삭제해도 무관한 것을 알 수 있다. (위 2가지 조건 불만족 시 무조건 출력)
무한정 'hello, world'를 출력하는 모습이다. 위와 같이 while문으로 간단히 코딩할 수 있으며,
만약 위와 같이 50번만 반복하고 싶다면 for문을 통해 counter인 i를 선언하여 50번 반복 할 수 있도록 한다. for문안의 내용은 (초기식, 조건식, 변화식)이다.
이번에는 좀 더 interactive한 코드인데 S에서 구현된 내용을 보면 'What's your name?'이라는 질문을 주고 대답을 받으면 이를 'hello, [name]'으로 출력하는 간단한 코드이다. C에서는 위와 같이 구현할 수 있으며 실제로는 CS50.h를 import해야한다. 따라서 answer이라는 변수의 type은 string이 되며 get_string이라는 함수를 통해 문자열을 받을 수 있게 된다.
또한 printf를 통해 출력할 때 어떠한 문자열을 출력할 때는 %s를 통해 parameter로 지정하고 여기에 할당되는 내용은 answer가 된다.
이제까지 봐왔던 C언어로 구현된 코드는 source code에 해당하고 컴퓨터가 이해하는 01011000110101110등과 같은 내용은 machine code라고 한다. 이 둘간에 변환자가 필요한데 이를 compiler라고 칭한다.
위는 CS50 Sandbox라고 하는 programming interface이다 굉장히 간단하게 원하는 언어로 프로그래밍을해서 결과를 즉각적으로 볼 수 있는 툴이다. 해당 강좌에서 숙제를 해결할 때 주로 활용하게 하기 위해 만든 것같다.
이제 hello.c라는 sourcecode를 machinecode로 변환하는 과정을 보여주는데 위의 명령어처럼 'clang -o hello hello.c'라고 입력하게 되면 마치 아무일도 일어나지 않은 것처럼 보이겠지만 이는 잘 변환이 되었음을 말한다. C언어로 작성된 hello.c라는 sourcecode가 hello라는 이름으로 프로그램이 output으로 나오게 되는 것이다.(만약 문제가 발생하면 빨간 error들이 나타나게 된다.) 이에 machinecode로 잘 변환이 되어 컴퓨터가 실행할 수 있는 상태가 되었기 때문에 './hello'라고 입력해주면 'hello, world'라고 잘 출력이 되는 것을 확인할 수 있다.
이 단계에서는 make라는 명령어를 사용하는 방법을 알려주고 이때 선제조건은 cs50.h파일을 include하는 것이다. sourcecode를 machinecode로 쉽게 변환할 수 있도록 만든 명령어이니 이 강좌를 수강하는 동안은 잘 활용할 수 있을 듯 하다.
이번에는 사용자로부터 이름을 받아 인사하는 프로그램을 만드는 방법을 보여준다. get_string을 통해 input을 받아 string type의 name 변수에 저장하고 이를 printf를 통해 'hello, [name]'을 출력하는 방식이다.
Terminal에서 'make hello'를 통해 자동적으로 C언어로 작성한 sourcecode가 machinecode로 변환을 시도하고 완료가 되면 './hello'라는 실행명령을 통해 작성한 프로그램이 구동되는 것을 볼 수 있다.
위에서 작성했던 방법처럼 저 대학원생들에게 각각 get_string, printf 함수의 역할을 주고 동작하도록 했다. 굉장히 확실하고 쉽게 이해할 수 있는 방법이었다.
이번에는 숫자를 입력받아 출력하는 방식에 대한 설명이며 이때는 get_string 대신 get_int를 사용하였고 이때 type은 int로 선언하게 된다. 출력시에도 %s대신 %i가 들어서서 출력할 수 있도록 한다.
float형식도 마찬가지로 진행하였다.
이번에는 사칙연산(+modulo)에 대해 integer type으로 진행하였을 때 결과를 지켜보았고,
(modulo는 나머지연산자라고 어떤 수를 다른 수로 나눴을 때 나머지가 얼마인지 출력한다)
x가 2, y가 10일 때 대부분의 결과들은 정상적으로 출력되었지만 나누기(/)만 비정상적으로 결과값이 나온것을 알 수 있다. '0.2'이어야 하는데 왜 0이 되었으며 남은 '.2'는 어디로 갔는가에 대한 답변은 다음과 같다. int type은 정수형이기 때문에 소수점자리의 정보들은 없어지게 된다. 따라서 소수점 이하의 정보를 담고 싶다면 float type으로 데이터를 저장해야 하는 것이다.
float type으로 modulo만 계산했을 때 화면이다. Default로 소수점 6번째 자리까지 나타나는 것을 알 수 있다.
위는 %f로 float type의 데이터를 받았던 것을 %.50f로 소수점 50번째자리까지 표기하도록 한 상태인데 결과값이 뭔가 이상한 것을 볼 수 있다. 정상적으로 라면 '2/10'은 소수점이 2개건 10개건 상관없이 0.20, 0.2000000000로 두 값은 같아야 한다. 하지만 실제로는 그렇지 않음을 알 수 있는데 이유는 다음과 같다.
컴퓨터를 분해해본 사람은 누구나 아는 RAM(Random Access Memory)이다. Hard disk와 다르게 임시로 정보를 저장하는 보조기억장치이다. 위와 같이 거의 무한한 정보를 담기에는 hardware는 유한한 공간을 가지고 있다. 따라서 위와 같이 어느 정도의 정확성을 초과한 데이터를 요구하게 되면 쓰레기값으로 차게된 정보가 반환된다.
이는 사소해보이지만 아주 큰 문제를 초래하게 될 수도 있다. 로켓 발사라던지 우주선 비행과 같이 아주 정밀하고 오차가 없어야 하는 상황에서 이 오차들이 누적이 되어 큰 사고의 원인이 되는 결과를 빚는다.
그래서 float type 대신 double type으로 변환하면 더욱 정확하게 값을 얻어낼 수는 있지만 여전히 오차는 존재하는 것을 알 수 있다. (float 소수점 8번째부터 오차, double 소수점 16번째부터 오차)
위에서 언급된 사소한 오차로 인해 발생할 수 있는 가장 간단한 예로 비교연산자(==)를 사용했을 때를 예시로 보여준다. 물론 여기서는 소수점 자리를 과도하게 가져가지 않음으로 정상적으로 동작하는 프로그램으로 구현하였다.
다음은 cough라는 프로그램을 개발하는 모습으로 'cough0.c'에서는 hardcoding으로 printf를 3번 반복함으로 구현하였다면 'cough1.c'에서는 for문을 통해 더욱 효율적인 코드로 바꾼 것을 확인 할 수 있다.
'cough2.c'에서는 cough라는 함수를 만들어 단순히 printf로 매번 사용하지 않고 함수만 호출함으로 동작하도록 바꾼 모습이다. 이때 주의점은 main함수 밑에 cough함수를 선언하고 정의하면 cough라는 것을 찾지 못했다라고 에러가 나타나게 되는데 이는 main함수 위에서 cough라는 함수가 있다라고만 선언해주면 쉽게 해결된다.
'cough3.c'에서는 cough함수가 딱히 input parameter가 없이도 구동이 되었지만 횟수를 input value로 입력하여 입력한 횟수만큼 구동되도록 변환했을 때 모습이다.
여기는 양수만 입력받도록 하는 함수를 구현한 모습인데 do-while문이라는 다른 형식의 함수를 사용한 모습이다. while문과의 차이점은 while문은 먼저 조건을 확인 후 실행이 되지만 do-while문은 먼저 실행 후 조건을 확인하게 된다.
이번에는 overflow라는 개념에 대한 설명이다. 위와 같이 데이터에 3자리만 저장할 수 있는 공간이 있다고 할 때 값이 999이고 1을 더하면,
1000이 되어야 하지만 실제 공간은 3칸이기 때문에 1000이라는 값이,
000이 된다. 마치 초기화 된 것처럼. 이 것을 overflow현상이라고 한다.
이를 다시 컴퓨터들의 숫자 2진법으로 보자. 똑같이 각 자리에 1이 들어서있고 여기에 1을 더하면,
1000이 아닌,
000이 된다.
정확히는 integer overflow라고 부른다.
여기 한 게임이 있는 게임에서 얻을 수 있는 코인의 Max값이 4 billion이라고 한다. 이는 32bits가 코인의 자릿수인데 이를 통해 최대로 카운트할 수 있는 값이 위와 같다고 한다.
Overflow를 보여주는 코드이며 중간에 '//'는 주석처리를 하는 문자이다. 해당 프로그램은 시작값을 1로 하여 2배씩 값을 증가시키고 출력하게 하는 것이다. overflow가 일어 날때까지. 값을 출력할 때 sleep함수를 통해 1초씩 쉬는 것을 알 수 있다.
실행 화면이며 값이 꽤 커졌을 때 어느 순간 overflow가 일어나서 값이 0으로 초기화 된 듯한 모습이다.
이는 예전에 컴퓨터에서 1999년에서 2000년으로 넘어갈때 2000년이 아닌 1900년으로 표기한 문제와도 연관이 있다. 이전에는 무조건 20세기(1900년대)였기 때문에 앞에 19는 default이고 뒤에 두자리만 연산하면 되었지만 21세기(2000년대)로 넘어갈 때 상황이 바뀌었던 것이다. 따라서 이는 추후에 수정되었다.
또 다른 사례로는 보잉787 비행기의 고장 케이스였는데 어떤 이유로 인해 비행기가 248일 동안 전원이 꺼지지 않고 켜져있었는데 이 때 발전기의 안전 알람이 해제되었다고 한다. 원래는 주기적으로 on-off를 통해 내부 카운터가 초기화 되었어야 하는데 그러지 못하여 계속 켜져있는 동안 카운터값이 증가했고 248일 째 되던날 overflow가 발생하여 안전 알람이 해제되어 문제를 일으켰다고 한다.
이번에는 underflow에 대한 설명인데 위와 같이 값들이 모두 0으로 차있을 때 1을 빼게 되면
-1이 아닌 값이 모두 1로 차서 마치 최대값이 된 것처럼 보일 수 있게 된다.
이에 대한 예시로는 예전에 나왔던 버전의 Civilization이라는 게임이다. 간디의 호전도(aggressiveness level)은 1로 낮은 수치 였지만 위와 같이 민주주의를 도입하게 되면 호전도가 2 감소하게 되는 이는 underflow를 일으켜 평화주의 간디가 전쟁광이 되어버린다는...
이번 강의도 굉장히 유익하고 쉽고 재밌는 예시까지 있어서 즐거웠다. 이제 숙제를 해봐야 겠지만.
댓글
댓글 쓰기