1. 콤마 오퍼레이터
int a = 1;
int b = 2;
int c = (++a, ++b);
위 코드에서 콤마 연산자의 기능은 콤마로 나열이 되어 있을때 콤마 왼쪽을 계산한 후 콤마 오른쪽을 계산하고,
콤마 오른쪽 계산을 한 값을 c에 대입한 것이다.
int a = 1;
int b = 2;
++a;
++b;
int c = b;
풀어서 보면 이렇게 계산한 것과 같은 것이다.
책에서도 잘 다루지 않는 부분이고 당장은 쓸모가 없다고 느낄 수 있지만
for문이 복잡한 형태가 될 경우에 매우 유용하게 사용할 수 있는 연산자이기 때문에 알아놓으면 좋다.
2. 컨디셔널 오퍼레이터 (삼항 연산자)
bool onSale = true;
const price = (onSale == true) ? 500 : 1000;
onSale이 true면 price가 500, false면 1000이 된다. 만약 if문을 사용한다면 어떻게될까?
const price에 대입할 숫자를 return하는 함수를 만들어 onSale을 argument로 받고,
if문을 사용해 price값을 return하는 번거로운 과정을 거치게 된다.
이렇게 간단한 코드일 경우엔 컨디셔널 오퍼레이터를 사용하는게 깔끔하고 보기 편하다.
하지만 복잡한 경우엔 if문으로 쪼개서 사용하는게 이해하기 편하고 디버깅이 더 쉽기 때문에 사용하지 않는게 좋다.
3. 이진법
십진수를 이진수로 표현하는 대표적인 방법. 십진수를 2로 나눠서 나머지를 밑에서부터 읽으면 된다.
148 (decimal to binary)
148 / 2 = 74 r0 (r = remainder)
74 / 2 = 37 r0
37 / 2 = 18 r1
18 / 2 = 9 r0
9 / 2 = 4 r1
4 / 2 = 2 r0
2 / 2 = 1 r0
1 / 2 = 0 r1
1001 0100
만약 148이 아니라 98일때를 생각해보면 나머지가 1100010로 7자리가 되는건 어떻게 표현할까?
8비트 자료형이라면 맨앞 비트에 0을 채워서 0110 0010으로 표현하면 된다.
이진수끼리 더하는 방법. 가장 아래자리부터 더하고 1이 두개면 다음자리에 넘겨주면서 더하면 된다
11
0110 (6 in decimal)
0111 (7 in decimal)
----
1101 = 13 in decimal
음의 정수를 이진수로 표현하는 방법.
-5를 이진수로 표현하기
1. 양수라고 생각하고 이진수를 구한다.
0000 0101
2. 보수(complement)를 취한다.
1111 1010
3. 1을 더한다.
1111 1011
여기서 주의해야 할 점은 숫자가 unsigned가 아닌 signed 일때,
맨앞에 있는 비트는 이 숫자가 양수인지 음수인지를 표현할때 사용된다.
0이면 양수, 1이면 음수이다.
이 방법에서 의문점이 있을 수 있다.
왜 마지막에 1을 더하는 것일까? 0을 이진수로 변환해본다고 생각해보자.
1. 0000 0000
2. 1111 1111
3. 0000 0000
0에 보수를 취하고 1을 더하지 않으면 0이 두가지 형태를 가지게 되버린다.
마지막에 1을 더해줌으로써 양의 정수로써 표현한 0과 음의 정수로 표현한 0이 같아지는 것을 볼 수 있다.
이진수로 표현이 된 음의 정수를 십진수로 바꿔보자.
1001 1110
위와같은 8비트짜리 이진수 정수가 있다고 해보자. 맨 앞의 숫자가 1이므로 signed이다.
음수이므로 보수를 취하고 1을 더하자.
0110 0001
//여기에다 1을 더하면
0110 0010
0110 0010을 십진수로 바꾸면 64 + 32 + 2 = 98. 처음에 signed인걸 확인했으니 -98이 된다.
여기선 8비트짜리 이진수이기 때문에 signed라고 알 수 있는 것이다. 맨처음에 계산했던 148은 2^7보다
크기 때문에 8비트 안에 들어갈수 없으므로 자료형의 크기가 8비트보다 클 것이고
앞에 있는 비트는 0으로 채워져 있을 거라고 생각할 수 있다.
'C++' 카테고리의 다른 글
3-3. C++ 비트 플래그, 비트 마스크 (1) | 2024.01.30 |
---|---|
3-2. C++ 비트단위 연산자(shift,AND,OR,XOR) (1) | 2024.01.29 |
2-2. 오버플로우, 부동소수점 (1) | 2024.01.26 |
2-1. C++ 변수와 기본 자료형 (1) | 2024.01.26 |
1-2. C++의 기초 (namespace, 전처리기) (12) | 2024.01.24 |