Week 02
< 180328 >
1) 두 변수의 값 변경
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #include <stdio.h> int main() { int a = 5; int b = 7; int t = a; a = b; b = t; printf("%d %d\n", a, b); a = 5; b = 7; a = a+b; b = a-b; a = a-b; printf("%d %d\n", a, b); return 0; } | cs |
>> a 컵에는 콜라, b컵에는 쥬스가 담겨있는 상황에서, 두 잔의 내용물을 바꾸고 싶을 때, 새로운 잔(t)를 이용하면 된다..!!
>> 17-19 는 새로운 변수 없이 두 정수값을 바꾸는 테크닉..?? 학교 교재에 있는 내용이라고 함..
2) sizeof 연산자 활용하기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #include <stdio.h> int main() { char ch = 'A'; int n = 5; double d = 3.14; printf("char: %dbyte\n", sizeof(char)); // 1 printf("int: %dbyte\n", sizeof(int)); // 4 printf("flot: %dbyte\n", sizeof(float)); // 4 printf("double: %dbyte\n", sizeof(double)); // 8 printf("long: %dbyte\n", sizeof(long)); // 8 printf("long long: %dbyte\n", sizeof(long long)); // 8 printf("1: %dbyte\n", sizeof(1)); // 4 printf("'A': %dbyte\n", sizeof('A')); // 4 printf("3.14: %dbyte\n", sizeof(3.14)); // 8 printf("1LL: %dbyte\n", sizeof(1LL)); // 8 printf("ch: %dbyte\n", sizeof(ch)); // 1 printf("n: %dbyte\n", sizeof(n)); // 4 printf("d: %dbyte\n", sizeof(d)); // 8 return 0; } | cs |
>> 17 번 라인이 좀 특이하다. 1바이트를 기대했는데 4바이트가 나온다.
>> 관련 내용은 여기를 참고..!! (http://hashcode.co.kr/questions/76/cc에서-sizeofa의-차이)
3) 문자가 데이터에 어떻게 저장되는지..??
1 | char ch = 'A'; | cs |
위 코드의 경우 ch 라는 변수는 메모리 1바이트(8비트)를 차지한다.
그리고 해당 8비트에서 최 상위 비트는 부호비트를 나타낸다. 0은 양수, 1은 음수..!!
'A' 의 정체는 아스키 코드값 10진수로 65에 해당한다.
65는 이진수로 01000001 이다
즉, 8비트 기준으로 01000001 의 형태로 저장이 된다.
상위 1비트는 부호비트 이므로 char 타입의 변수에는 -128 ~ 127 까지의 값을 저장할 수 있다.
즉 256 개의 데이터를 저장할 수 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 | #include <stdio.h> int main() { char a = 127; printf("%d\n", a); // 127 a = a+1; printf("%d\n", a); // -128 return 0; } | cs |
>> 7 번라인의 결과는 127이다. 하지만 10의 결과는 128이 아닌 -128이 출력이 된다.
>> 127 은 2진수로 표현하면 01111111 이다. 여기에 1을 더하면 10000000 이 된다.
>> 최상위 비트는 부호비트인데 부호비트가 0에서 1로 변경되었다. 즉 음수가 되었다.
>> 다음 내용을 설명하기 전에, -1 이란 값에 대해 알아보자.
>> -1은 8비트 기준 11111111 이며, 32비트 기준 11111111 11111111 11111111 11111111 과 같이 표현한 수 있다.
>> 즉 1로만 가득채워진다.
>> 증명 : 위 값에 1을 더하면 0이된다. 8비트 기준 100000000 이 되는데, 1는 비트 범위를 넘어가므로 버리게 되므로 00000000, 즉 0이 된다.
>> 그렇다면 11111111을 이용해서 10000000 을 만들어보자.
>> 11111111 에서 01111111 을 빼면 10000000 이 된다.
>> 즉 -1에서 127을 뺀 결과이며 위 결과는 정확하게 -128이 나오게 된다.
4) 최상위 비트를 부호비트로 사용하지 않고싶다면..?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #include <stdio.h> int main() { unsigned char a = 127; printf("%d\n", a); // 127 a = a+1; printf("%d\n", a); // 128 a = 255; printf("%d\n", a); // 255 a = a+1; printf("%d\n", a); // 0 return 0; } | cs |
>> 변수를 선언할 때, 자료형 앞에 unsigned 를 추가로 선언하면 된다.
>> 11111111 은 255라는 값이 되며, 여기서 1을 더하면 0이 된다.
5) '1' vs 1
그러다면 위의 결과는..?
'1' 은 1바이트이며, '1'은 아스키코드값 10진수로 49에 해당한다.
49는 이진수로 110001 이므로 00110001 의 형태로 저장이 된다.
1은 정수이므로 4바이트가 필요하다. 그리고 1은 이진수로 1이다
그렇기 때문에 00000000 00000000 00000000 00000001 의 형태로 저장이 된다.
<숙제>
- 2의 보수 검색해보기.
- 오버플로우 검색해보기
Week 01
< 180321 >
- C 언어는 main() 에서부터 시작한다..!!
- 첫 프로그래밍
1 2 3 4 5 6 7 | #include <stdio.h> int main() { printf("Hello World"); return 0; } | cs |
>> 1 : 헤더파일 선언, #include <stdio.h> 에서 stdio는 standard input output 의 약자.
- 주석처리
1 2 3 4 5 6 7 | //#include <stdio.h> int main() { printf("Hello World"); return 0; } | cs |
>> 1 : // 는 한줄을 주석처리 한다. 주석처리 하면 해당 라인을 무시한다.
>> 위의 경우 1번 라인을 무시하게 되면 printf() 를 사용할 수 없게 된다.
- 서식문자 : %d, %c, %lf
1 2 3 4 5 6 7 8 9 | #include <stdio.h> int main() { printf("int : %d\n", 20); printf("char : %c\n", 'A'); printf("double : %lf\n", 3.141592); return 0; } | cs |
>> 20 은 상수형 정수
>> 'A' 는 상수형 문자
>> 3.141592 는 상수형 실수
>> printf() 에서 정수를 출력하고 싶을 땐 서식문자 %d를, 문자는 %c, 실수는 %lf 를 사용한다.
>> 위의 경우 세종류의 데이터가 있다. 정수형, 문자형, 실수형
- 변수를 선언하고, 값을 대입하고 출력하기.
1) 정수
1 2 3 4 5 6 7 8 9 | #include <stdio.h> int main() { int num; num = 3; printf("num = %d\n", num); return 0; } | cs |
>> 5 : 정수형 변수 선언. 정수형 데이터를 담는 변수를 선언하기 위해서는 int 라는 자료형을 선언하고 한칸 띄고 변수 이름을 쓴다. (변수이름은 마음데로, 하지만 작명규칙이 존재, 찾아볼것.)
>> 6 : 정수값을 num 이란 변수에 대입. 여기서 = 는 대입연산자 이다.
1 2 3 4 5 6 7 8 9 10 11 12 | #include <stdio.h> int main() { int num; num = 3; printf("num = %d\n", num); // num = 3 num = 7; printf("num = %d\n", num); // num = 7 return 0; } | cs |
>> 9 : num 이란 변수에 7을 대입. 10 라인에서 num = 7 이란 결과가 출력
>> 변수 vs 상수 : 변수는 변하는 값. 어떤 값을 대입하냐에 따라 값이 바뀔 수 있다. 하지만 상수는 그 값 자체로만 사용이 가능. 그래서 상수.
2) 문자
1 2 3 4 5 6 7 8 9 | #include <stdio.h> int main() { char ch; ch = 'A'; printf("ch = %c\n", ch); // ch = A return 0; } | cs |
>> 5 : 문자를 담는 변수를 선언하기 위해서는 자료형 char 을 사용
3) 실수
1 2 3 4 5 6 7 8 9 | #include <stdio.h> int main() { double dnum; dnum = 3.14; printf("dnum = %lf\n", dnum); // dnum = 3.140000 return 0; } | cs |
>> 5 : 실수를 담는 변수를 선언하기 위해서는 자료형 double 를 선언한다.
>> 7 : 실행결과는 dnum = 3.140000 , 기본적으로 소수점 6자리까지 출력한다.
- 문자의 정체
1 2 3 4 5 6 7 8 | #include <stdio.h> int main() { char ch = 'b'-'a'; printf("ch = %d\n", ch); // ch = 1 return 0; } | cs |
>> 5 : 변수 ch를 선언과 동시에 'b'-'a' 값으로 초기화
>> 여기서 'b'-'a' 라는 연산이 가능하다...!!
1) 문자의 정체는 정수. 실제로 어떤 문자는 어떤 정수의 값으로 매핑(매칭)되어 있다. (아스키 코드표 참조)
2) 아스키 코드값의 특징
>> 문자인 숫자는 '0', '1', '2', ... '9' 의 순서로 되어 있다. 얼마에 매핑되어 있는지는 외울 필요 없음.
>> 알파벳 대문자는 'A', 'B', 'C', ... , 'Z' 순으로 되어있다.
>> 알파벳 소문자는 'a', 'b', 'c', ... , 'z' 순으로 되어 있따.
>> 알파벳 대문자가 소문자보다 앞선다. (작은 값을 갖는다.)
>> 'a' 와 'A'의 차이, 'b' 와 'B'등 소문자와 대문자 사이의 아스키코드 값 차이는 일정하다.
>> 널문자의 아스키 코드값은 0 (알아두면 좋음.)
- 소문자를 대문자로, 대문자를 소문자로 변경해서 출력하기.
1 2 3 4 5 6 7 8 9 10 11 | #include <stdio.h> int main() { char ch1 = 'a'; char ch2 = 'A'; char diff = 'a'-'A'; printf("a => %c\n", ch1-diff); // a => A printf("A => %c\n", ch2+diff); // A => a return 0; } | cs |
>> 소문자와 대문자의 차이가 일정하기 때문에, 그 일정한 값을 대문자에서 더해주면 소문자가 되고, 소문자에서 빼주면 대문자가 된다...!!
- 문자 '9' 를 정수 9로 표현하기.
1 2 3 4 5 6 7 8 9 | #include <stdio.h> int main() { char num = '9'; printf("num = %c\n", num); printf("num = %d\n", num-'0'); return 0; } | cs |
>> 6, 7번라인 모두 9를 출력한다. 6의 결과는 문자형태의 9, 7의 결과는 정수형태의 9.
>> '1' 과 '0' 의 차이는 1 이다.
>> '2' 와 '1'의 차이도 1 이다.
>> '2' 와'0'의 차이는 2이다. >> '9' 와 '0'의 차이는 9 가 된다..!!
- 기타
1) 검색은 구글에서.
2) 소스코드를 실행했을 때 뜨는 창의 이름은 콘솔창.
3) VS2017 에서 빌드하고 컴파일 할때 단축시 사용하기..!!
4) C 언어의 소스코드 확장자는 .c
5) 과제는 기왕이면 해와서 튜터링 시간에 맞춰보기.
- 숙제
1) 1 vs '1' 의 차이 알아보기.