22018, 1/1101 회원가입  로그인  
   pjh0717
   '1000 0000' 이게 사람 미치게 하네요...

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


1바이트 짜리 1000 0000 이 있습니다.

이건 10진수로 얼마일까요...;;;;

이걸 2의 보수로 표현하면

먼저 비트 반전하면 0111 1111이 됩니다

거기서 1을 더하면 1000 0000

........ 뭐지?????? (캐리 때문에 이런가?)

지금 이것 땜시 2시간동안 잠도 못자고 이러고 있습니다.....

  Hit : 9124     Date : 2011/02/07 02:23



    
blueh4g 원래 바이트로 따질때 음수를 표현할때는 제일 앞자리를 부호비트로 사용합니다~
원래 정수는 4바이트로 쓰이지만 굳이 1바이트로 따지자면
00000000 도 0이고 (+0)
10000000 도 0입니다 (-0)

해당하는 1바이트로 따질수 있는 최대값이 넘어가서 그렇지요~
1바이트로 표현할수 있는(음수 포함해서) 최대값은 -127~+127 까지입니다 ㅎ
근데 그 값을 넘어서서 128을 쓰려고 하니까 저런현상이 발생하는거지요 ㅋ
2011/02/07  
blueh4g 질문에 첫번째 대답인 1바이트짜리 10000000 을 10진수로 따지자면, 부호비트를 넣었을경우 0 (-0이 되겠죠?) 이고, 부호비트가 없을경우엔 128 (이경우엔 2의보수로 취한다는 자체가 에러 ㅎ) 2011/02/07  
.Dolphin pjh님 바~보 2011/02/07  
rkdgh0112 ㄷㄷ.. ㅋ 2011/02/07  
BlueWhale 앜ㅋㅋㅋ 돌핀님 최곸ㅋㅋㅋㅋㅋㅋㅋ 2011/02/07  
별빛을담아 윈도우 계산기는 각 2,8,10,16진법으로의 변환을 해준다죠...

2의보수는 뭐 blueh4g형님이 설명해 주셨고...
2011/02/07  
ggabu420 음? blueh4g 님이 약간 오타가 나신 것 같은데...
signed char (1바이트 음수) 의 표현 범위는 -128 ~ 127 로 기억합니다.
(항상 이런 정수 범위는 음수쪽과 양수쪽이 1 차이가 납니다. 음수쪽이 더 크죠)

부호 비트인 MSB 가 0인 상태를 고정시킬 때 1바이트에서 양수 최대의 범위는 자연히
01111111 이 됩니다. 즉 2의 보수를 취해서 의미가 있는 값이 여기까지입니다.
128 은 2진수로 10000000 이 맞습니다. 이 값은 2의 보수화를 해도 그대로이기 때문에
-128 이 됩니다.

이것은 비단 128 이라는 숫자만의 특성이 아니라, 어떤 n바이트를 이용하여 표현할 수 있는 모든
음수+양수 를 포함한 범위에서, 최대로 작은 수를 표현하려 할 때 항상 일어납니다.

다른 예를 들어볼까요? i386에서 signed short int 의 경우 2바이트 타입입니다. 이 경우
표현할 수 있는 범위는 -32768~32767 입니다. 그러면 32768 에다가 2의 보수화를 하면
어떻게 될까요? 네. 역시 32768 의 2진수와 똑같습니다.


덧붙여서, 글쓴이가 정말 프로그래머라면 질문하기 전에 직접 프로그램을 짜봅시다.
이해를 쉽게 하기 위해서 4바이트 타입으로 똑같이 해보면 됩니다.
signed int 의 범위는 -2147483648~2147483647 입니다.

int a = -2147483647;
printf(\"%d\",~a+1); // 이건 2의 보수화임

2147483647 이라는 결과가 나오지요? 이것은 저 수에 2의 보수화를 했으니 당연한 결과입니다.
그럼 이제 다르게 해봅니다.

int a = -2147483648;
printf(\"%d\",~a+1);

어떤가요? 아마 죽었다 깨어나도 2147483648 이 나올 일은 없을 것입니다.
엄밀히 말해 -2147483648 과 2147483648 은 같은 2진수값을 가지기 때문입니다.

2147483648 은 범위를 넘어섰기 때문에 blueh4g 님의 말씀대로 이미 2의 보수로 취한다는
발상 자체가 에러입니다. 둘 다 부호 비트가 1이기 때문입니다.

말은 길게 했지만 결국 답은 둘 다 부호비트가 1이기 때문에 2의 보수화를 취할 수 없다 입니다.
어떤 수이든 MSB가 1인 경우는 항상 음수에서만 생각해주어야 하는 것입니다.
(위에서도 말했듯이 이것은 수의 범위를 n바이트로 제한했기 때문임)

p.s 참고로 MSB를 부호 비트로 생각을 하든 안하든 0은 항상 모든 비트가 0인 경우입니다.
결국 -0 이라는 것은 존재하지 않습니다.
2011/02/07  
blueh4g ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 답변달았다가 개쪽 ㅋㅋㅋㅋㅋ ggabu420 님의 답변을 참고해주세요 ㅋㅋㅋ큐ㅠㅠㅠㅠㅠㅋㅋㅋㅋㅋㅋㅋ 2011/02/07  
ggabu420 헐 오타는 누구나 나는거임.. 2011/02/07  
pjh0717 바보... ㅋㅋㅋ 네 저 바보맞네요 ㅎㅎㅎ 2011/02/08