2012-11-07 3 views
3

변수에 대해 비트 연산을 수행했습니다.비트 연산자의 설명

int p=3,q=5; 
int a=~p,b=~q; //complement a and b 
printf("%d %d\t%d %d",p,a,q,b); 

'b'의 이론 출력은 10이고 서명 된 경우 -2가되어야합니다. 그러나 출력은 -6입니다.

누군가 내게 그 작업을 설명 할 수 있습니까?

+5

"이론 출력 b"가 왜 10입니까? – Mat

+0

나는 그것을 편집했다. 지금은 괜찮습니다. –

+4

* "이론적 인 10"*에 대해서'int'는 크기가 4 비트가 아니라는 것을 명심하십시오. (힌트 : 비트 NOT에서 맨 앞의 0은 어떻게됩니까?) –

답변

7

은 기본적으로 -x - 1을 계산하는 c (또는 python)의 비트 보수 연산자입니다. (~ X + 1) - 숫자 X의 최상위 비트가 1이면 2의 보수 표현에서

0 -1 
1 -2 
2 -3 
3 -4 
4 -5 
5 -6 

가, 다음, 실제 값은 다음과 같습니다처럼

그래서 테이블이 보일 것이다. 예를 들어

,

0b11110000 = -(~0b1111 + 1) = -(15 + 1) = -16. 

이 음수의 자연 표현,

0000001 = 1 
0000000 = 0 
1111111 = -1 (wrap around) 
1111110 = -2 
1111101 = -3 etc. 

는 세부 사항에 대한 http://en.wikipedia.org/wiki/Two%27s_complement를 참조하기 때문이다.

+1

그것은 반드시 모든 부호와 값 비트를 보완하도록 정의되었고, 구현이 두 개의 보수를 사용하는지, 1의 보수 또는 부호 크기는 구현에 따라 정의됩니다. – caf

3

p은 0b11이므로 a은 (16 비트 int라고 가정) 0b1111111111111100 = 부호없는 경우 0xFFFC이고 서명 된 경우 -3입니다.

q이 0b101이므로 b은 (16 비트 정수라고 가정) 0b1111111111111010 = 0xFFFA (부호가없는 경우) 및 -6 (서명 된 경우)이됩니다.

+3

당신은 1s와 Fs의 뭉치를 잊었거나 32를 쓸 때 16을 의미했습니다. –

+0

WHOOPS! 당신 말이 맞아요. 내가 32 비트를 선호하는 동안, 나는 그것을 더 읽기 쉽도록 만들기 위해 16을 사용한다 ... – glglgl

+0

@unknownDownvoter하지만 이것은 정말로 -1의 이유인가? 나는 의도가 충분히 명확 해 졌다고 생각한다. – glglgl

1

p를 보완하면서 (즉, 5) 1010, 즉 10 일 것으로 예상됩니다. 그러나 사실은 하나의 보수 연산 중에 발생하며 모든 비트가 반전됩니다.

이 프로그램을 고려하십시오.

#include <stdio.h> 

int main() 
{ 

int p=5,q=3; 
int a=~p,b=~q; //complement a and b 
printf("%x %x\t%x %x",p,a,q,b); 

return 0; 
} 

프린트 % D를 사용하여 인쇄하는 동안 따라서 기호를 고려

5 fffffffa 3 fffffffc 

.