본 글은 이재범님의 모두의 코드 : 씹어먹는 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 바이트가 된다.