변수에 대해 비트 연산을 수행했습니다.비트 연산자의 설명
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입니다.
누군가 내게 그 작업을 설명 할 수 있습니까?
변수에 대해 비트 연산을 수행했습니다.비트 연산자의 설명
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입니다.
누군가 내게 그 작업을 설명 할 수 있습니까?
은 기본적으로 -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의 보수 또는 부호 크기는 구현에 따라 정의됩니다. – caf
p
은 0b11이므로 a
은 (16 비트 int라고 가정) 0b1111111111111100 = 부호없는 경우 0xFFFC이고 서명 된 경우 -3입니다.
q
이 0b101이므로 b
은 (16 비트 정수라고 가정) 0b1111111111111010 = 0xFFFA (부호가없는 경우) 및 -6 (서명 된 경우)이됩니다.
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
.
"이론 출력 b"가 왜 10입니까? – Mat
나는 그것을 편집했다. 지금은 괜찮습니다. –
* "이론적 인 10"*에 대해서'int'는 크기가 4 비트가 아니라는 것을 명심하십시오. (힌트 : 비트 NOT에서 맨 앞의 0은 어떻게됩니까?) –