2011-11-03 2 views
3

나는 출력이 "0000"을해야한다 생각하지만 그건 FFFF 당신은 a에 값을 다시 지정해야 0000 0000 0000 000016 진수 값 0xffff가 아니십니까?

#include<stdio.h> 
int main() 
{ 
    unsigned int a=0xffff; 
    ~a; 
    printf("%x\n", a); 
    return 0; 
} 
+2

도움이되는 힌트 - gcc의 -Wall로 컴파일하면 효과가없는 명령문이있을 때 경고 메시지가 표시됩니다. "thing.c : 6 : 3 : warning : 아무런 효과가없는 문장". – dbeer

답변

5

을하고 있지 않습니다 수 있습니다.

코드를 a = ~a;으로 변경하더라도 0이되지 않을 수 있습니다. unsigned int에 16 비트가 넘으면 앞에 0이 생기므로 반전 된 후 1이됩니다.

그래서 나는 당신이 할 수있는, 당신의 출력이

FFFF0000

또는

FFFFFFFFFFFF0000

16 비트 비트 연산을 원하는 경우에도

될 것으로 기대

을 사용하십시오. 다른 사람들이 이미 말했듯이
#include <inttypes.h> 
uint16_t a; 
15

~ ffff-의 없음>으로 : 심지어

a = ~a; 

다음, 출력 된 값으로 인해 데이터 타입의 크기로, 다음과 같이 할 수 있습니다

ffff0000 

그것 (모두 0)를 예상대로 작동하게하려면,의 초기 값을 설정~ UINT_MAX (limits.h에서). 이렇게하면 모든 비트가 1으로 설정됩니다.

+0

예. 나는 그걸 또한 해냈고 출력은 "ffff0000"입니다. 논리를 이해할 수 없습니다. – Dorjay

+0

@ 도제트 : 내 대답은 이제 분명히 분명히 있어야합니다. –

+0

고마워요 :) – Dorjay

7

쓰기 ~a;은 아무런 효과가 없습니다. a의 보수를 반환하지만 a은 변경되지 않습니다.

당신은 a = ~a;을 원합니다.

3

에 값을 할당하지 않았기 때문에. 당신은 a = ~ a가 필요합니다;

1

~a 그 자체는 a의 비트 보수를 나타내는 명령문입니다. (@timcooper에서 알 수 있듯이) 당신은 ~a에 할당 할 수 있습니다하거나, 팀 및 블라드 말했듯이 당신은, 당신은 비트 단위 반전에 아무것도

printf("%xn", ~a); 
1

, 당신은 a = ~a;으로 다시 값을 할당하거나 직접, 당신은 아직도 당신이 예상대로 제로를 얻을하지 않을 printf("%x\n",~a);로하지만 어느 경우에 결과를 인쇄하거나해야합니다.

~ 연산자는 변수의 모든 비트를 뒤집습니다. 32 비트 정수를 처리 할 가능성이 가장 높으므로 0xFFFF0000으로 끝날 것입니다. 상위 16 비트가 0에서 1로 반전되기 때문입니다.