본 글은 이재범님의 모두의 코드 : 씹어먹는 C 언어 강좌를 정리합니다.
컴퓨터는 0과 1로 계산을 한다.
그럼 인간도 0과 1로 계산을 해야하는걸까? 아니다.
인간의 언어를 컴퓨터가 이해할 수 있는 기계어로 변환해주는 것이 컴파일러다.
include <stdtio.h>
int main()
{
printf("hello, World!\n");
return 0;
}
hello world 를 출력하기 위해서는 많은 과정을 거친다.
간단히 요약하면 운영체제에게 \'hello, World!
출력해줘!' 메시지를 보내면
운영체제는 모니터에 hello world를 출력해준다.
하지만 우리는 운영체제에게 '모니터에 hello, World!
출력해줘' 라는 메시지를 보낸 적이 없다 어떻게 된 걸까?
이 과정을 stdio.h 파일이 대신 처리해준다.
stdio 는 STandard Input Output header 의 약자로, 표준 입출력 헤더다.
이 파일은 입출력, 즉 화면에 출력하고, 키보드로 부터 입력을 받아들이는 것을 담당하고 있다.
따라서 include <stdio.h> 는 stdio.h 파일을 포함하라는 뜻이며 입출력 관련 일을 처리 해주는 함수들의 묶음이다.
0을 반환한다는 의미다.
0을 왜 반환하는 걸까? 누구에게 반환할까? 0 말고 1,2 는 안되는걸까?
1을 반환해도 에러가 없는데 왜 0을 사용하는거지?
return 0; : 컴퓨터에게 프로그램이 종료되었음을 알린다.
return 1; : 컴퓨터에게 프로그램이 종료되지 않음, 오류가 발생했음을 알린다.
C언어는 //
와 /* */
을 사용한다.
11001010₂ = 1 X 2⁷ + 1 X 2⁶ + 0 X 2⁵ + 0 X 2⁴ + 1 X 2³ + 0 X 2² + 1 X 2¹ + 1 X 2⁰
자리수가 하나 올라갈 때 마다 그 자리수의 값이 두 배로 된다.
··· 의 기호는 나머지를 뜻한다.
>>> divmod(25, 2)
(12, 1) # 몫이 12, 나머지는 1
>>> divmod(12, 2)
(6, 0) # 몫이 6, 나머지는 0
>>> divmod(6, 2)
(3, 0) # 몫이 3, 나머지는 0
>>> divmod(3, 2)
(1, 1) # 몫이 1, 나머지는 1
>>> divmod(1, 2)
(0, 1) # 몫이 0, 나머지는 1
십진수를 2 로 나누어서 몫이 0 이 될 때 까지 구한 다음에 나머지들만 역순으로 재배치 하면 2진수가 된다.
2진수는 표현하기도 읽기도 힘들다. 항상 10010010 같은 이진수를 매번 표현하고 읽어야 된다 생각해보라 상당히 불편하다.
그래서 프로그래머들은 16진수를 사용한다.
16진수는 16개의 수를 사용한다. ➨ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, A, B, C, D, E, F
십진수를 2진수로 표현하는 방법과 같다.
16
으로 나눠 몫이 0
이 될 때까지 구한 후 나머지들을 역순으로 배치하면 된다.
16782 = 4 X 16³ + 1 X 16² + 8 X 16¹ + 14×16⁰ = 0x418E
단순히 16 진수의 각 자리수를 4 자리 (반드시) 이진수로 변환해 준다.
컴퓨터의 한 개의 메모리 소자는 0 혹은 1 의 값을 보관한다.
Bit : 0 혹은 1 즉 1개의 비트는 0 또는 1을 저장한다.
하지만 Bit는 0과 1만 저장할 수 있어 저장하는 크기가 너무 작다.
그래서, 8 개의 비트를 묶어서 바이트(Byte) 라 부른다. 8 비트 == 1 바이트
컴퓨터에서 연산을 담당하는 CPU에는 레지스터(register) 라는 작은 메모리 공간이 있는데, 이곳에다가 값을 불러다 놓고 연산을 수행한다.
예를 들어 a + b 를 하기 위해서는 a 와 b 의 값을 어디다 적어놓아야지, a + b 를 할 수 있는 것처럼, CPU 에서 연산을 수행하기 위해 잠시 써놓는 부분을 레지스터라고 한다.
이러한 레지스터의 크기는 컴퓨터 상에서 연산이 실행되는 최소 단위라고 볼 수 있고, 이 크기를 워드 라고 부른다. 32 비트 컴퓨터 시절에서는 이 1 워드가 32 비트, 즉 4 바이트 였지만, 지금 우리가 사용하는 64 비트 컴퓨터의 경우 1 워드가 64 비트, 즉 8 바이트가 된다.