[c언어 기초]

우리가 아는 C언어

[c언어 기초] 우리가 아는 C언어

연산자(보수, 삼항)

보수와 삼항 연산자

비트 연산자'~'

비트 연산자 '~'는 비트열의 값들을 각각 부정(not)하라는 뜻으로 각 자리수의 비트값을 반대로 바꾸어 1의 보수로 변환시키며 이 숫자를 컴퓨터는 보통 2의 보수로 취급하여 문자를 읽게 해줍니다. 

네....

비트값을 부정하며, 1의 보수로 변환시키고 또 컴퓨터는 2의 보수로 읽는 답니다... 

일단은 비트 연산자'~'을 알기전에 보수의 개념에 대해 먼저 알아봅시다.

보수

보수는 보충을 해주는 수를 의미합니다.
예를 들어 1에 대한 10의 보수는 9, 4에 대한 15의 보수는 11의 개념입니다. 2에 대한 1의 보수는 1이죠.

1의 보수의 경우, 2진수의 각 자릿수가 1이 되기 위해 더해주어야 되는 수로 0과 1로 이루어진 2진수의 경우 1의 보수를 통해 반전됩니다. 즉 (0 → 1, 1 → 0), (11000011) 2진수의 1의보수

2의 보수의 경우, 어떠한 수 보다 큰 2의 제곱수에서 뺀 뒤 얻은 수로 1의 보수를 취한 2진수에 추가로 1을 더합니다.

 즉 '1의 보수+1 = 2의 보수' 가 됩니다.

이해가 안된다고요?   일단 아래의 내용을 봅시다. 

 
컴퓨터는 정수를 2진수 32bit 형태로 저장하며 음의 정수를 '2의 보수 표현' 방식으로 저장하거나 출력합니다.
예를 들어 9의 2진수 형태인 1001을 32비트로 만들어
0000 0000 0000 0000 0000 0000 0000 1001식으로 저장한뒤 1의 보수나 2의 보수로 바꾸어 -9를 저장하죠.
 
그럼 1의 보수와 2의 보수로 표현한 9의 2진수는 어떠한 형태일까요?
1111 1111 1111 1111 1111 1111 1111 0110  (1의 보수)이 되며 이 값은 -9가 되는거죠. 그리고
1111 1111 1111 1111 1111 1111 1111 0111  (2의 보수)또한 -9가 됩니다.
위의 32 비트의 2진수를 '1의 보수로 보냐', '2의 보수로 보냐'에 따라서 값이 달라진다는 것이죠.

이해가 됬나요? 

우리가 배우는 '~'는 어떠한 수를 1의 보수로 변환시키므로
만약 컴퓨터가 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)

과 같은 관계로 표현됩니다.

삼항 연산자

3개의 요소로 이루어지는 3항(ternary)연산자는
"조건식 ? 참일때의값 : 거짓일때의값"의 구조를 가지는 연산자 입니다.

아래의 코드를 직접 작성하고 실행해 봅시다. 

#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을 출력합니다.

다음 토픽에서는 복합 대입 연산자와 증감 연산자에 대해서 알아봅시다. 

 

댓글

댓글 본문
  1. yaholigaoli
    소중한 정보 감사합니다~~
  2. Noir
    잘봤습니다
  3. life knowledge
    수정했습니다. ^^
    대화보기
    • Adera
      감사합니다.
      그런데 삼항 연산자의 예시 코드의 4번째 줄에서 "%d"가 아닌 "%d\n"가 들어가야 할것 같습니다.
    • 호두
      고맙습니다.
    버전 관리
    life knowledge
    현재 버전
    선택 버전
    graphittie 자세히 보기