나는 ~ 연산자가 연산을하지 않는다는 것을 알고있었습니다. 하지만 다음 프로그램 (-65536)의 출력을 확인할 수는 없습니다. 정확히 무슨 일이 일어나고있는거야?정수 값에 NOT 연산
#include <stdio.h>
int main(void) {
int b = 0xFFFF;
printf("%d",~b);
return 0;
}
나는 ~ 연산자가 연산을하지 않는다는 것을 알고있었습니다. 하지만 다음 프로그램 (-65536)의 출력을 확인할 수는 없습니다. 정확히 무슨 일이 일어나고있는거야?정수 값에 NOT 연산
#include <stdio.h>
int main(void) {
int b = 0xFFFF;
printf("%d",~b);
return 0;
}
0xffff
의 32 비트 정수를 b
에 할당하면 b
변수는 실제로 0x0000ffff
이됩니다. 즉, 비트 보완을 수행하면이되며 0xffff0000
이되어 십진수 -65536
과 같습니다.
C++의 ~ 연산자는 비트 NOT 연산자입니다. 비트 보수라고도합니다. 이것은 부호가 인 비트를 뒤집습니다. 귀하가 제공 한 초기 정수 값을 나타내는 비트를 반전합니다
int b = 8;
// b in binary = 1000
// ~b = 0111
이
가 있다면 예를 들어.
~ b = 0111 int가 4 비트 인 경우에만.32 비트 정수라고 가정하면 이진수가 1111111111110111 일 가능성이 가장 높습니다. – franji1
오른쪽이지만 아키텍처에 대한 정보는 제공하지 않았습니다. –
정수의 모든 이진수에 대해 비트 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
당신을하지를,
최상위 비트는 부호 비트 (양수 또는 음수)가되므로 음수가됩니다.
,이 출력은 무슨 일이 일어나고 있는지 이해하는 데 도움이 될 수 있습니다 더 나은 :
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 진수로 데이터를 검사하면 무슨 일이 일어나는지 알 수 있습니다.
가정 32 비트 정수
int b = 0xFFFF; => b = 0x0000FFFF
~b = 0xFFFF0000
는 상위 비트가 설정된다. 2s complement이라고 가정 할 때, 이는 음수라는 것을 의미합니다.다른 비트를 반전 한 다음 하나를 더하면 0x00010000
또는 65536
결과는 플랫폼에 부호있는 정수가 어떻게 표시되는지에 따라 달라집니다. 가장 일반적인 표현은 음수 값을 나타 내기 위해 "2s complement"산술을 사용하는 32 비트 값입니다. 즉, 음수 값 -x
은 부호없는 값 2^32 - x
과 동일한 비트 패턴으로 표시됩니다. 이 경우
원래 비트 패턴 하위 16 개 비트가 설정 가지고
0x0000ffff
비트 NOT 해당 비트를 클리어하고, 상위 16 개 비트를 설정한다 : A와이를 해석
0xffff0000
을 음수는 -65536
값을 제공합니다.
보통 이런 종류의 혼란을 피하기 위해 비트 연산을 사용하는 경우 부호없는 유형을 사용하려고합니다.
귀하의 코멘트 :
는 '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입니다.
그래서 당신은 이미 무엇을하는지 정확히 알고 있습니다. – aaronman
@spectpectus C++ 태그를 사용하여 질문에 C 태그를 추가하거나 그 반대의 경우도 마찬가지입니다. 이들은 다른 언어입니다. 질문이 C++가 아니고 C++로 잘못 태그 지정되었다고 생각되면 C 태그를 추가 할 때 C++ 태그를 제거해야합니다. – Dukeling
@aaronman 'b'가 아닌 경우 출력은 0이어야하지만 이유는 -65536입니다. –