How We Coding

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