프로그래밍 언어/C, C++

[C/C++] 정수형 변수에 논리 부정 연산하기

호무비 2022. 4. 23. 19:11
반응형

오늘은 C언어에서 정수형 변수에 논리 부정(NOT) 연산을 하면 어떻게 될지 알아보도록 하겠습니다.

 

개인적으로 궁금해서 직접 실험해보고 이렇게 글로 남기게 되었습니다.


C언어와 Boolean 타입

 

C언어는 Boolean 타입을 지원하지 않다 보니 논리형 변수와 정수형 변수를 공유합니다. 즉, 조건식에 정수형 변수가 들어갈 수 있다는 것입니다. 이 때문에 C언어에서는 BOOL이라는 사용자 정의형 타입을 만들어서 씁니다. C99부터 _Bool 타입이 표준으로 들어왔으므로 해당 타입을 사용해도 됩니다. 물론 그렇다고 해서 정수형 변수가 논리값으로 사용할 수 없는 것이 아니기 때문에 여전히 크게 다를 것은 없습니다.

 

C++에서는 bool 형 타입을 지원하지만, 이 역시 자바나 타 언어에서의 true, false와는 다르게 여전히 조건식에 정수형 변수가 들어갈 수 있습니다. C와의 호환성을 위해 남아 있는 기능이겠지만, 이는 오류나 실수의 원인이 될 수 있다는 점에서 그다지 좋은 사용법은 아닙니다. (물론 필요에 따라 잘 활용할 수도 있습니다.)


정수형 변수 논리 부정 실험

 

문득 정수형 변수에 논리 부정을 하게 되면 그 결과는 어떻게 될까 궁금해졌습니다. 기본적으로 C에서는 0이면 false, 1이면 true로 취급합니다. 즉, 논리 부정하면 0은 1이 될 거고, 1은 0이 될 것이라 쉽게 예측할 수 있습니다. 남은 건 0, 1 외의 다른 숫자가 어떤 값이 될 지입니다.

 

일반적으로 0 외의 모든 값은 true로 취급하기 때문에 아마도 논리 부정을 하게 되면 1과 마찬가지로 0이 되겠지 싶었습니다. 그래도 궁금하니 직접 간단한 코드로 확인해보기로 했습니다.

 

#include <iostream>
#include <bitset>
using namespace std;

int main() {
    int a = 5;
    int b = 0;

    cout << "a  : " << bitset<4>(a) << endl;
    cout << "!a : " << bitset<4>(!a) << endl;
    cout << "b  : " << bitset<4>(b) << endl;
    cout << "!b : " << bitset<4>(!b) << endl;

    return 0;
}

 

짧은 코드를 짜보았습니다. 비트 단위로 출력해볼까 하여 bitset 헤더 파일도 가져왔습니다. 추가로 0도 그냥 한 번 찍어봤습니다. 사실 잘 보면 C라기보다는 C++ 코드지만 양쪽 다 크게 다를 것이 없으니 그냥 이대로 테스트해 보겠습니다.

 

과연 그 결과는...

 

결과

 

예상했던 대로 0이 되었습니다. 당연한 얘기지만 원래 0이었던 b는 1로 바뀌었습니다. 생각했던 것보다 시시한 실험이었습니다. 참고로 gcc 컴파일러를 사용했는데, 아마 다른 컴파일러도 비슷한 결과를 출력할 것으로 생각합니다. (궁금하신 분은 직접 시도해보시기를 바랍니다.)


결론
정수 값을 논리 부정 하면 0은 1이 되고, 그 외에는 0이 된다.

 

다음에 또 궁금한 게 생기면 실험해보도록 하겠습니다.

 

직접 조사해서 작성하는 글이다 보니 일부 정확하지 않은 정보가 포함되어 있을 수 있습니다.

궁금한 사항이나 잘못된 내용이 있으면 댓글로 알려주세요~

구독과 좋아요, 환영합니다!

 

반응형