c언어 비트단위 연산자에서 질문입니다 ㅜㅜ

c언어 비트단위 연산자에서 질문입니다 ㅜㅜ

작성일 2011.01.03댓글 2건
    게시물 수정 , 삭제는 로그인 필요

연산자 비트단위 연산에서

int main()
{
  int a;


  char a=15;
  char c=30;
  char b=~a;
  char d=~c;

 printf("%d",b);
 printf("%d",d);

 return 0;
}


위의 결과값이 -16 과 -31 이 출력이됩니다

컴퓨터 데이터방식의 이해를 해보면  00001111 <--- 이것이 15 입니다

~비트단위연산자를 통하여 11110000 이되고 이것을 음수로 출력하려면
11110000 -1 <----  -17  이 되어버립니다 ㅡㅡ (코딩해서 컴파일해보면 -16 결과값이 나오지만 계산해보면 -17 이되네요 )
하지만 00011110 <--- 이것은 30 입니다
11100001 -1 <---- -31 이 됩니다   (코딩한 컴파일  결과값과 계산해본 결과값이 같네요 )
대체 왜이런거죠 ㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜ



profile_image 익명 작성일 -

~는 1의보수 이고, CPU ALU의 계산에서 음수는 주로 2의보수로 계산 합니다.

따라서 그냥 ~만 하면 음수와는 차이가 있죠.

 

15을 ~15 한 경우 2진수는

 

0000 1111    :  15

1111 0000    : ~15

 

만약

char a=-15;

했다면 a의 변수가 갖는 값은 -15가 될것입니다. 2진수로 바꾸어 표시하면

 

0000 1111    :  15

1111 0000    :  15의 1의보수

0000 0001   :   1

---------  +  더하기 

1111 0001   ===> 이것이 -15죠.

 

그래서 -16이라는 출력값이 나오거죠.

 

1의 보수와 2의 보수 차이 때문에 -1차리가 나는 거죠.

 

16을 같은 방식으로 음수로 바꾸면

 

0001 0000    :  16

1110 1111    :  16의 1의보수

0000 0001   :   1

---------  +  더하기 

1111 0000   ===> 이것이 -16죠.

-16은 15의 보수가 되는 거죠.

 

그러면 왜 2의 보수를 사용하는가?

우선 +와 -가 연산이 수학적으로 일반화된 단순연산과 맞는 거죠.

 

15 + (-15) = 0

이죠.

그러나 1의 보수로 정수형을 결정 했다면

 

0000 1111   : 15

1111 0000   : 만약 15의 1의보수로 -15을 결정 했다면

----------  +

1111 1111   ===> 0결과는 동떨어진 값이죠.

 

그런나 2의 보수로 결정 한다면

 

0000 1111   : 15

1111 0001   : 만약 15의 2의보수로 -15을 결정 했다면

----------  +

0000  0000   ===> 정확하게 0결과가 나오죠.

 

이런것도 있고 값을 하나 절약 한다는 것도 있겠죠.

 

 

참고 :

http://blog.naver.com/dolicom/10008898286

 

 

profile_image 익명 작성일 -

컴퓨터에서 계산하는 것은 2의 보수로

바이트 단위(8비트)에서 보면 다음과 같습니다.

첫비트 가 1이면 인버트를 취한 값을 절대값으로 한 후 1을 빼고 -를 붙입니다.

 

 

0000 0000 0        1111 1111   인버트 하면 0000 0000 즉 0이 된 후에 1을 빼면  -1

0000 0001 1        1111 1110   인버트 하면 0000 0001 즉 1이 된 후에 1을 빼면  -2

....

0000 1111 15      1111 0000    인버트 하면 0000 1111 즉 15이 된 후에 1을 빼면 -16

....

0001 1110 30      1110 0001     인버트 하면 0001 1110  즉 30이 된 후에 1을 빼면 -31

 

 

-17이 아니고 -16이 맞습니다.

 

C언어 비트단위 이동연산자에 대한...

C언어에서 비트단위 이동연산자를 공부하는 중에 잘 이해가 안되서 질문을 올려요 << 랑 >> 이거 쓸때요 둘다 똑같이 0 이랑 1로 채워 주는 건가요?? 그러니까... <<랑 >> 둘다...

c언어 비트 연산자 질문이요 ...

... (나머지 비트는 모두 0으로 채워진 상태) 이것을 정수 x와 서로 비트단위 논리 AND연산인 & 연산을 하게되면 비트 0의 나머지 구간은 모두 0이 나오고 비트 1의...

C언어 비트연산자

... 비트 단위 연산자 사용) 1. #include <stdio.h> 2. int main(void) 3. { 4. int n; 5. printf... 질문에 답이 있네요. 7번째 줄에서 1의보수 1111~010 다음에 끝에 1을 더해야 답...