나는 출력이 "0000"을해야한다 생각하지만 그건 FFFF 당신은 a
에 값을 다시 지정해야 0000 0000 0000 000016 진수 값 0xffff가 아니십니까?
#include<stdio.h>
int main()
{
unsigned int a=0xffff;
~a;
printf("%x\n", a);
return 0;
}
나는 출력이 "0000"을해야한다 생각하지만 그건 FFFF 당신은 a
에 값을 다시 지정해야 0000 0000 0000 000016 진수 값 0xffff가 아니십니까?
#include<stdio.h>
int main()
{
unsigned int a=0xffff;
~a;
printf("%x\n", a);
return 0;
}
을하고 있지 않습니다 수 있습니다.
코드를 a = ~a;
으로 변경하더라도 0이되지 않을 수 있습니다. unsigned int
에 16 비트가 넘으면 앞에 0이 생기므로 반전 된 후 1이됩니다.
그래서 나는 당신이 할 수있는, 당신의 출력이
FFFF0000
또는
FFFFFFFFFFFF0000
16 비트 비트 연산을 원하는 경우에도
될 것으로 기대 을 사용하십시오. 다른 사람들이 이미 말했듯이#include <inttypes.h> uint16_t a;
쓰기 ~a;
은 아무런 효과가 없습니다. a
의 보수를 반환하지만 a
은 변경되지 않습니다.
당신은 a = ~a;
을 원합니다.
에 값을 할당하지 않았기 때문에. 당신은 a = ~ a가 필요합니다;
~a
그 자체는 a
의 비트 보수를 나타내는 명령문입니다. (@timcooper에서 알 수 있듯이) 당신은 ~a
에 할당 할 수 있습니다하거나, 팀 및 블라드 말했듯이 당신은, 당신은 비트 단위 반전에 아무것도
printf("%xn", ~a);
, 당신은 a = ~a;
으로 다시 값을 할당하거나 직접, 당신은 아직도 당신이 예상대로 제로를 얻을하지 않을 printf("%x\n",~a);
로하지만 어느 경우에 결과를 인쇄하거나해야합니다.
~ 연산자는 변수의 모든 비트를 뒤집습니다. 32 비트 정수를 처리 할 가능성이 가장 높으므로 0xFFFF0000
으로 끝날 것입니다. 상위 16 비트가 0에서 1로 반전되기 때문입니다.
도움이되는 힌트 - gcc의 -Wall로 컴파일하면 효과가없는 명령문이있을 때 경고 메시지가 표시됩니다. "thing.c : 6 : 3 : warning : 아무런 효과가없는 문장". – dbeer