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의 보수 검색해보기.
- 오버플로우 검색해보기