본문 바로가기

Programming

(136)
컴퓨터에서 소수를 표현하는 방법 1. 0.1을 100번 더하면? 다음 코드를 보자. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #include int main() { float num; int i; for (i = 0; i 1.0110011 ② 소수점 아래를 23비트로 만든다. -> 1.01100110000000000000000 ③ 소수점 아래만 떼어낸다. -> m = 01100110000000000000000 다음은 지수부다. 왜 e 가 아닌 e-127 이고, 하필 127 을 빼주는 걸까? 앞의 그림을 다시 보자. 부호(1비트) 지수(8비트) 가수(23비트) 지수는 8비트다. 따라서 00000000~11111111(255)의 수를 나타낼 수 있다. 그런데 지수부에서는 음수를 표현해야 하는 경우도 생긴다. 이 때 별도의..
조건 분기 1. 분기 분기(branch)는 프로그램의 실행 흐름을 선택하는 것을 말한다. 두 수를 입력받아 계산하는 계산기를 만든다고 생각해보자. 입력받는 것까지는 문제 없다. 하지만 그 다음이 문제다. 사칙연산의 결과를 모두 출력할 수는 있다. 하지만 그 중 하나를 고르는 건 어떻게 해야 할까? 이를 위해 필요한 게 분기문이다. 분기문은 기본적으로 조건에 의해 이루어진다 다시 말해, 조건에 따라 실행 여부를 결정한다는 것이다. 물론 무조건 분기도 있다. 하지만 상대적으로 사용 빈도가 낮다. 앞에서 예시로 든 계산기의 경우 다음과 같이 실행 여부를 결정할 수 있다. 수행할 연산을 입력받는다. 입력받은 연산이 +면 덧셈을 수행한다. 아니면 다음 줄로 넘어간다. 입력받은 연산이 -면 뺄셈을 수행한다. 입력받은 연산이 ..
비트 연산 1. 시프트 연산 시프트(shift) 연산은 비트 열을 밀어내는 연산을 말한다. 비트 열을 밀어내는 연산이므로 2진수에 대해서만 가능한 연산이다. C언어에서는 > 연산자로 이를 구현하고 있다. 예를 들어 22 > 3은 다음과 같이 연산된다. 이 때 왼쪽의 빈 자리에는 원래 수의 최상위 비트 값이 채워진다. 따라서 부호가 유지된다. 또한 최하위 자리를 넘어간 비트는 버려진다. 따라서 연산의 결과는 다음과 같다. 2. 2의 보수법 컴퓨터에서는 *최상위 비트를 사용해 부호를 나타내는 것이 일반적이다. 이 비트 값이 0이면 양수, 1이면 음수를 나타낸다. -5는 2진수로 어떻게 나타낼까? 단순히 생각하면 5가 2진수로 00000101이니까, -5는 10000101일 것 같지만, 그렇지 않다. 예를 들어, -5를..
컴퓨터가 2진수를 사용하는 이유 컴퓨터는 IC 칩으로 구성되어 있다. 컴퓨터의 내부는 *IC로 구성되어 있다. IC는 다음과 같이 검은 몸체의 양쪽에 여러 개의 다리가 붙어 있는 형태다. 위 IC 칩의 경우 양쪽의 8개의 다리가 달려있는 것이다. 이 다리를 핀(pin)이라고 하며, 각 핀은 두 가지 상태를 갖는다. 이 두 가지 상태는 전압이 있거나(보통 +5V), 전압이 없거나(0V)로 표현된다. 이런 이유로 컴퓨터는 전압이 있을 때는 1, 전압이 없을 때는 0, 즉 0과 1로만 구성되는 2진수로 데이터를 표현하게 된 것이다. 물론 컴퓨터 때문에 2진수가 고안된 것이 아니라 IC의 특성이 2진수와 잘 맞기 때문에 2진수를 쓰는 것이다. 이 때 최소 단위, 그러니까 0 또는 1을 비트(bit)라고 한다. 비트는 원래 파편이라는 뜻으로, ..
반복문 1. 반복문 문자열 "Hello, world!" 를 5번 출력하려면 어떻게 해야 할까? 당연히 printf("Hello, world!\n"); 를 5번 호출하면 된다. 그럼 문자열 "Hello, world!" 를 10번 출력하려면 어떻게 해야 할까? 당연히 printf("Hello, world!\n"); 를 10번 호출하면 된다. 문자열 "Hello, world!" 를 500번 출력하려면 어떻게 해야 할까? 그 때도 printf("Hello, world!\n"); 를 500번 호출할 것인가? 물론 가능은 하겠지만, (500번을 세야 하니) 코딩 하기도 불편하고, 비효율적이다. 그래서 같은 작업을 여러번 수행하고 싶을 때는 반복문을 사용하는 것이 좋다. C언어에는 while 문, do-while 문, fo..
입력과 출력 1. 키보드로부터의 입력 모니터로 출력할 때는 printf 함수를 사용했듯이, 키보드로부터 입력을 받을 때에도 어떤 함수를 사용해야 한다. 이 때 사용되는 함수가 scanf 함수다. 사용법은 printf 함수와 매우 유사하다. scanf("%d", &num); 정수를 키보드로부터 입력받아 변수 num 에 저장한다는 의미다. 여기서 주목할 점은 변수 앞에 붙은 & 연산자다. 왜 그런지는 조금 뒤에 설명하겠다. 우선은 &를 변수 앞에 붙여줘야 한다는 것만 기억하자. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #include int main() { int num1, num2; int result; printf("첫 번째 정수 입력: "); scanf("%d", &num1)..
연산자 1. 연산자 3 + 5 = 8 위 식의 +와 같이 값의 연산을 위해 사용되는 기호를 연산자(operator), 3, 5와 같이 연산되는 값을 피연산자(operand)라 한다. 초등학교 수학에서 배우는 +, -, ×, ÷ 등이 연산자의 예다. 연산자는 기능에 따라 다음과 같이 나누겠다. 산술 연산자, 비트 연산자, 논리 연산자, 대입 연산자, 관계 연산자, 기타 연산자 참고로 피연산자의 수를 기준으로 해서 다음과 같이 나눌 수도 있다. 단항 연산자(unary operator), 이항 연산자(binary operator), 삼항 연산자(ternary operator) 2. 대입 연산자와 산술 연산자 산술 연산은 사칙 연산과 같이 수치에 대한 연산을 말한다. 연산자 기능 결합 방향 예시 = 우변의 값을 좌변의..
CPU가 수행하는 작업 프로그램이 아무리 복잡해도 CPU는 실제로 다음의 4가지 작업만을 수행한다.니모닉은 생략한다. 명령어 기능 데이터 전송 명령어 레지스터-메모리 / 메모리-메모리 / 레지스터-주변 기기 간의 데이터 전송 연산 명령어 어큐뮬레이터를 이용해 산술 및 논리 연산, 크기 비교, shift 연산 점프 명령어 조건 분기, 반복, 무조건 점프 호출 / 리턴 명령어 함수 호출 및 함수 호출부로 복귀