949, 1/48 회원가입  로그인  
   twt525
   [2진수] 2진수표현질문요 ㅠ

http://www.hackerschool.org/HS_Boards/zboard.php?AllArticle=true&no=242 [복사]


비트연산자중 ~연산자 있자나요
0이면 1을 반환
1이면 0을반환하는것요
근데 15를 넣었어요 int num = 15
00000000 00000000 00000000 00001111 (인트변수크기는 4바이트라고 하더군요)
~연산자를 쓰니까
11111111 11111111 11111111 11110000
이렇게 나오면 부호비트가 1이니까 음수잖아요
근데 왜 이계 -16일까요
열혈씨 프로그래밍 개정판에
11111111 11111111 11111111 11110000 =-16이라고 나오는데..
잘이해가안됩니다 답변부탁요~

  Hit : 5489     Date : 2011/06/04 08:26



    
profreez 음수를 쓸때 2의 보수를 취하는데요.
예를 들면 32비트말고 8비트로 예를 들면
00001111 = 15 잖아요.
이걸 2의 보수로 -15로 표현한다면

모든 비트를 뒤집고 거기에 +1을 해주면됩니다.
00001111 = 15

11110000 = ~ 연산
+ 1
-----------------------
11110001 = -15
2011/06/04  
별빛을담아 으음... Byte사이즈를 기준으로 알려드릴게요
Byte사이즈에는 0000 0000 총 8자리에요
그렇다면 최대 숫자는 1111 1111 = 255가 되어야 겠죠

하지만 한가지 간과하고 넘어간게 있으니... 바로 첫 비트는 부호표시에 쓴다는 점입니다.
우리가 변수선언할 때 그냥 int를 쓰면 부호표시로 1비트를 쓴다는 것이고
unsigned int라는걸 선언 해야 비로소 부호비트 없이 변수를 쓸 수 있다는거죠

따라서 signed int를 쓰고 있으니까 0 000 0000으로 구분되고
0 000 0000 는 양수, 1 000 0000는 음수가 되겠죠.

기억해 두셔요. unsigned를 선언하지 않으면 1비트가 부호표시를 위해 희생됩니다.

P. S. ▶1비트◀
2011/06/04  
twt525 profreez// 아아 그런거군요~답변감사합니다 . 또 질문이있는데 만약소스를
#include <stdio.h>
int main(void)
{
int num1 =15;
int num2 =~num1;
printf("NOT연산의 결과: %d\n",num2);
return 0;
}
로 하면 -16으로 나오는데 왜 컴퓨터가 1을 더하지 않는건가요?

별빛을담아//아아 새로운사실 감사합니다~
2011/06/04  
profreez ~는 모든 비트를 뒤집는 Not 연산자입니다.(이것을 1의보수라고 말을하죠)
음수로 바꾸는 연산자가 아니죠

그럼 11110000 가 양수로 얼마인지 알아보는 방법은.. 이것을 2의 보수를 취하면됩니다.

1111 0000

0000 1111 = 15 ~ 연산결과
+ 1
-------------------
0001 0000 = 16

고로 1111 0000 는 -16이라는 뜻이죠
2011/06/04