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이 된 것을 확인 할 수 있다. +