diff --git a/README.md b/README.md
index b8088d82da8eaa44dd2b32ec8ae6fb52e367ff86..1c0514bedb4244c0dafff209128247e69389669c 100644
--- a/README.md
+++ b/README.md
@@ -258,3 +258,74 @@ int main()
 >> * signed일때에는 0을 채운다.
 * 따라서 변수 선언 타입이 signed인지, unsigned 인지에 따라 같은 값도 다르게 출력된다. 
 
+
+## lesson05
+
+1. x86-64 뜻 
+>> x86 : cpu가 intel cpu 
+>> 64 : intel cpu를 위한 64bit
+> * intel에서는 8086칩, 80486칩, 80586칩 등이 있다.
+
+2. gcc시 작동원리
+> 1. cpp 가 돈다.
+>> * 이때 cpp 는 C pre process의 약자이다.
+> 2. gcc 컴파일러가 돈다.
+> 3. ld (로더)가 돈다.
+> 4. 뭉쳐서 a.out이 생성된다.
+
+3. signed와 unsigned
+> * signed는 일반 int 선언시 기본적으로 선언되는 타입이며 %d등으로 정수를 할당받는다.
+> * unsigned는 %u 로 정수를 할당받는다. 
+> * 음수를(signed) %u로 할당받아도 에러가 나지 않고, integer를 unsigned integer로 바꾼 것과 같아진다. 
+> * signed를 unsigned에 할당하여 출력하게 되면 표현방법만 달라진다.
+> * ### 따라서 signed로 받든 unsigned로 받는 같은 수를 입력시에는 두 수의 bit 데이터는 같다. 그저 표현할때 달라질 뿐이다. 즉, 메모리에 있는 bit입장에서 보면 바뀐게 없고 signed integer를 unsigned integer로 바꿀때 아무것도 하지 않는다. 
+ 따라서 아래의 코드를 살펴보면
+```C
+#include <stdio.h>
+int main()
+{
+    signed int siA;
+    unsigned int unA;
+
+    fscanf(stdin, "%d", &siA);
+    fprintf(stdout, "Signed Integer : %d\n", siA);
+    unA = siA;
+    fprintf(stdout, "Unsigned Integer : %u\n", unA);
+    fprintf(stdout, "Unsigned Integer percent d : %d\n", unA);
+    fprintf(stdout, "Signed Integer percent u : %u\n", siA);
+}
+```
+>* unsigned 를 %d 로 출력한 값과 signed를 %d로 출력한 값은 표현이 같다.
+>* signed를 %u로 출력한 값과 unsigned를 %u로 출력한 값은 서로 표현이 같다. 
+>* 따라서 그냥 %u와 %d의 표현 차이일뿐 내부 bit 데이터는 같다는 것을 확인 할 수 있다. 
+
+
+* signed에 큰 양수를 넣어 오버플로우가 일어나면 음수가 되어 나온다. 따라서 signed와 unsigned 사용시 조심해서 사용해야한다. 
+* unsigned int는 양수를 나타내지만 unsigned int를 더해도 숫자가 줄어들수도 있다! - 아래의 코드를 예로 살펴보면
+```C
+#include<stdio.h>
+int main()
+{
+        signed int siA;
+        unsigned int unA;
+        signed int sumS;
+        unsigned int sumU;
+
+        fscanf(stdin, "%d", &siA);
+        fprintf(stdout, "Signed Integer :  %d\n", siA);
+        unA = siA;
+        fprintf(stdout, "Unsigned Integer : %u\n", unA);
+        fprintf(stdout, "Unsigned Integer percent d : %d\n", unA);
+        fprintf(stdout, "signed Integer percent u : %u\n", siA);
+
+        sumS = siA + unA;
+        sumU = siA + unA;
+        fprintf(stdout, "sumS %%d %d\n", sumS);
+        fprintf(stdout, "sumS %%u %u\n", sumS);
+        fprintf(stdout, "sumU %%d %d\n", sumU);
+        fprintf(stdout, "sumU %%u %u\n", sumU);
+}
+```
+* 해당 코드 실행시 음수인 -100을 siA에 대한 input값으로 넣어 sumS와 sumU에 관한 결과를 살펴보면 두 값은 %d로 출력했을 때 모두 -200이 나왔고 %u로 출력했을 때 모두 4294967096이 나왔다. 
+* 분명 unA는 unsigned 값인데 -100인 siA값에 unA를 더하자 값이 줄어 -200이 된 것을 확인 할 수 있다. 
+