How We Coding

Tutoring/18-1 C Lang +12

Week 02

Tutoring/18-1 C Lang2018. 3. 28. 18:46

< 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의 보수 검색해보기.

- 오버플로우 검색해보기

'Tutoring > 18-1 C Lang' 카테고리의 다른 글

Week 06  (0) 2018.04.23
Week 05  (0) 2018.04.18
Week 04  (0) 2018.04.11
Week 03  (0) 2018.04.04
Week 01  (0) 2018.03.21

Week 01

Tutoring/18-1 C Lang2018. 3. 21. 17:29

< 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' 의 차이 알아보기.



'Tutoring > 18-1 C Lang' 카테고리의 다른 글

Week 06  (0) 2018.04.23
Week 05  (0) 2018.04.18
Week 04  (0) 2018.04.11
Week 03  (0) 2018.04.04
Week 02  (2) 2018.03.28