2013-07-30 1 views
3

나는 ~ 연산자가 연산을하지 않는다는 것을 알고있었습니다. 하지만 다음 프로그램 (-65536)의 출력을 확인할 수는 없습니다. 정확히 무슨 일이 일어나고있는거야?정수 값에 NOT 연산

#include <stdio.h> 

int main(void) { 
    int b = 0xFFFF; 
    printf("%d",~b); 
    return 0; 
} 
+1

그래서 당신은 이미 무엇을하는지 정확히 알고 있습니다. – aaronman

+2

@spectpectus C++ 태그를 사용하여 질문에 C 태그를 추가하거나 그 반대의 경우도 마찬가지입니다. 이들은 다른 언어입니다. 질문이 C++가 아니고 C++로 잘못 태그 지정되었다고 생각되면 C 태그를 추가 할 때 C++ 태그를 제거해야합니다. – Dukeling

+0

@aaronman 'b'가 아닌 경우 출력은 0이어야하지만 이유는 -65536입니다. –

답변

4

0xffff의 32 비트 정수를 b에 할당하면 b 변수는 실제로 0x0000ffff이됩니다. 즉, 비트 보완을 수행하면이되며 0xffff0000이되어 십진수 -65536과 같습니다.

그것은 비트 보수를하고있다
1

C++의 ~ 연산자는 비트 NOT 연산자입니다. 비트 보수라고도합니다. 이것은 부호가 인 비트를 뒤집습니다. 귀하가 제공 한 초기 정수 값을 나타내는 비트를 반전합니다

int b = 8; 
// b in binary = 1000 
// ~b = 0111 

가 있다면 예를 들어

.

+0

~ b = 0111 int가 4 비트 인 경우에만.32 비트 정수라고 가정하면 이진수가 1111111111110111 일 가능성이 가장 높습니다. – franji1

+0

오른쪽이지만 아키텍처에 대한 정보는 제공하지 않았습니다. –

-1

정수의 모든 이진수에 대해 비트 NOT 연산은 모든 1을 0으로 변환하고 모든 0을 1로 만듭니다.

그래서 진수 0xFFFF이 이진 1111 1111 1111 1111 (각 진수 문자가 4 비트이고, F는 15 인, 모든 4 비트 전체 1 초입니다)

당신은 그것을 의미하는 32 비트 정수를 설정 지금이다 :

1111 1111 1111 1111 0000 0000 0000 0000

: 그것은 의미

0000 0000 0000 0000 1111 1111 1111 1111

다음

당신을하지를,

최상위 비트는 부호 비트 (양수 또는 음수)가되므로 음수가됩니다.

2

,이 출력은 무슨 일이 일어나고 있는지 이해하는 데 도움이 될 수 있습니다 더 나은 :

std::cout << std::hex << " b: " << std::setfill('0') << std::setw(8) << b 
      << " ~b: " << (~b) << " -65536: " << -65536 << std::endl ; 

나는 다음과 같다받은 결과 :

b: 0000ffff ~b: ffff0000 -65536: ffff0000 

을 그래서 우리가 설정하는 1의 하위 16 비트는 0000ffff을 제공하고 하위 16 비트는 0으로 설정하고 상위 16 비트는 1으로 설정하여 우리에게 ffff0000을 제공합니다 o -65536 10 진수.

이 경우 비트 연산으로 작업하기 때문에 16 진수로 데이터를 검사하면 무슨 일이 일어나는지 알 수 있습니다.

9

가정 32 비트 정수

int b = 0xFFFF; => b = 0x0000FFFF 
~b = 0xFFFF0000 

는 상위 비트가 설정된다. 2s complement이라고 가정 할 때, 이는 음수라는 것을 의미합니다.다른 비트를 반전 한 다음 하나를 더하면 0x00010000 또는 65536

1

결과는 플랫폼에 부호있는 정수가 어떻게 표시되는지에 따라 달라집니다. 가장 일반적인 표현은 음수 값을 나타 내기 위해 "2s complement"산술을 사용하는 32 비트 값입니다. 즉, 음수 값 -x은 부호없는 값 2^32 - x과 동일한 비트 패턴으로 표시됩니다. 이 경우

원래 비트 패턴 하위 16 개 비트가 설정 가지고

0x0000ffff 

비트 NOT 해당 비트를 클리어하고, 상위 16 개 비트를 설정한다 : A와이를 해석

0xffff0000 

을 음수는 -65536 값을 제공합니다.

보통 이런 종류의 혼란을 피하기 위해 비트 연산을 사용하는 경우 부호없는 유형을 사용하려고합니다.

0

귀하의 코멘트 :

는 'B'가 아닌 경우 .. 다음 출력은 0이되어야하지만 왜 -65536

당신의 결과를 기대하고 있음을 제안합니다 :

uint32_t x = 0xFFFF; 
uint32_t y = ~x; 

0으로 지정하십시오.

같은 논리적되지 조작 사실이 될 것이다

:

uint32_t x = 0xFFFF; 
uint32_t y = !x; 

...하지만 operator~을하지 논리적 아니지만, 비트 없습니다. 큰 차이가 있습니다.

논리 값은 0이 아닌 값 (true 값은 false)을 반환하고 0 값은 1을 반환합니다.

그러나 bitwise는 주어진 값의 각 비트를 반전하지 않습니다. 0xF의 그래서 이진 NOT :

0x0F: 00000000 11111111 
~0x0F: 11111111 00000000 

가 제로가 아니라 0xF0입니다.

관련 문제