비트 연산자'~'
비트 연산자 '~'는 비트열의 값들을 각각 부정(not)하라는 뜻으로 각 자리수의 비트값을 반대로 바꾸어 1의 보수로 변환시키며 이 숫자를 컴퓨터는 보통 2의 보수로 취급하여 문자를 읽게 해줍니다.
네....
비트값을 부정하며, 1의 보수로 변환시키고 또 컴퓨터는 2의 보수로 읽는 답니다...
일단은 비트 연산자'~'을 알기전에 보수의 개념에 대해 먼저 알아봅시다.
보수
1의 보수의 경우, 2진수의 각 자릿수가 1이 되기 위해 더해주어야 되는 수로 0과 1로 이루어진 2진수의 경우 1의 보수를 통해 반전됩니다. 즉 (0 → 1, 1 → 0), (1100→0011) 2진수의 1의보수
즉 '1의 보수+1 = 2의 보수' 가 됩니다.
이해가 안된다고요? 일단 아래의 내용을 봅시다.
예를 들어 9의 2진수 형태인 1001을 32비트로 만들어
1111 1111 1111 1111 1111 1111 1111 0111 (2의 보수)또한 -9가 됩니다.
이해가 됬나요?
만약 컴퓨터가 9의 1의 보수인 1111 1111 1111 1111 1111 1111 1111 0110을 저장하고
그것을 컴퓨터는 2의 보수로 읽어 결국 컴퓨터에 출력되는 값은 1111 1111 1111 1111 1111 1111 1111 0110을 2의 보수로 가지고 있는 -10이 출력됩니다.
그래도 이해가 안된다면 일단 넘어가보죠.....
아래의 코드를 직접 작성하고 실행시켜 봅시다.
#include <stdio.h> int main() { int a; scanf("%d", &a); printf("%d", ~a); }
실행결과
위 프로그램에 9를 넣었을때 결과값이 -10이 나옵니다.
- 6행의 ~는 각 자릿수의 비트값을 반대로 바꿉니다.
0000 0000 0000 0000 0000 0000 0000 1001이
1111 1111 1111 1111 1111 1111 1111 0110형태로 바뀌며 이것을 2의 보수로 컴퓨터가 읽는거죠.
1111 1111 1111 1111 1111 1111 1111 0110을 2의 보수라고 할때
1111 1111 1111 1111 1111 1111 1111 0110을 2의 보수로 가지고 있는 수는
-10이므로 결과값이 -10이 출력됩니다.
자 다시 한번 더 천천히 해봅시다.
9 :0000 0000 0000 0000 0000 0000 0000 1001 (9의 2진수를 32bit표현)↓↓
-9 :1111 1111 1111 1111 1111 1111 1111 0110 ('~'에 의한 9의 1의 보수 표현)컴퓨터에 저장 ↓↓
컴퓨터 :1111 1111 1111 1111 1111 1111 1111 0110 (2의 보수로 읽음)↓↓
출력: 1111 1111 1111 1111 1111 1111 1111 0110(-10 출력)의 2의 보수는 -10이다.
-10의 2의 보수 찾기
10: 0000 0000 0000 0000 0000 0000 0000 1010 (10의 2진수를 32bit표현)↓↓
-10:1111 1111 1111 1111 1111 1111 1111 0101(10의 1의 보수, 값은 -10이다.)↓↓
-10:1111 1111 1111 1111 1111 1111 1111 0110(10의 2의 보수, 값은 -10이다.)↓↓
즉
32 비트의 2진수를 '1의 보수로 보냐', '2의 보수로 보냐'에 따라서 값이 달라집니다.
비트 연산자(NOT, ‘~’)는
~n = -n – 1 (예시: ~9 = -9 -1 = -10)
-n = ~n + 1 (-9 = ~9 + 1)
과 같은 관계로 표현됩니다.
삼항 연산자
"조건식 ? 참일때의값 : 거짓일때의값"의 구조를 가지는 연산자 입니다.
아래의 코드를 직접 작성하고 실행해 봅시다.
#include<stdio.h> int main() { printf("%d\n", 4>3 ? 4:3); printf("%d", 4<3 ? 4:3); }
위 프로그램을 실행하면 각가 4와 3을 출력합니다.
- 4행에서 4>3은 참이므로 왼쪽에 있는 값인 4를 출력합니다.
- 5행에서 4<3은 거짓이므로 오른쪽에 있는 값이 3을 출력합니다.
다음 토픽에서는 복합 대입 연산자와 증감 연산자에 대해서 알아봅시다.