인프런 커뮤니티 질문&답변

Jungwon Chu님의 프로필 이미지
Jungwon Chu

작성한 질문수

홍정모의 따라하며 배우는 C언어

3.6 정수의 오버플로우

2진수 0 - 1 빼기 계산법을 모르겠습니다

작성

·

926

2

UINT_MAX + 1의 더하기 오버플로우

이진수표현은 이해가 갑니다

1111

+      1

--------

10000 >> 0000

그런데 0 - 1 빼기 오버플로우

이진수표현은 이해가 안됩니다

10000

-        1

--------

   1111

빼기는 어떤 방식으로 계산되는지 이해를 못했습니다

혹시 더하기 방식과 동일하게 앞에 - 기호를 무시하고

0에 1을 대입하는 건가요? ex) 11111 >> 1111

답변 5

2

안녕하세요 답변 도우미입니다.

제가 답변 드리기전에 먼저 자세하게 답변을 해주셔서 제가 답변 작성할 필요가 없어졌네요.😅

하온님 긴 답변 작성하시느라 ㅠㅠㅠ 고생하셨을텐데 지식 나눔해주셔서 감사드립니다. 😊 많은 분들께 도움이 될 것 같아요.

2

Jungwon Chu님의 프로필 이미지
Jungwon Chu
질문자

자세히 설명해 주셔서 정말 감사합니다

답변해 주신 3가지 예시(공식?)를 천천히 읽으면서 이해했습니다만 가장 이해+외우기 쉬웠던 부분은

0000 앞에 1를 추가 >> 10000

-1 >> - 0001

 10000     16 * 1 + 8 * 0 + 4 * 0 + 2 * 0 + 1 * 0 = 16

-  0001     8 * 0 + 4 * 0 + 2 * 0 + 1 * 1 = 1

------

16

1 >> -1

16 - 1 = 15

15 >>  1111

아무래도 제 머리가 단순해서

이 방식이 가장 단순하고 외우기 쉬웠던 것 같습니다

길게 답변해 주시느라 수고하셨습니다ㅠㅠ

다시 한번 감사드립니다(꾸벅)(꾸벅)

2

2진수 뺄샘에는 꿔오는방법과 보상방법이란것이 있는데요, 저도 어려웠고 질문자님도 이해하기어려울것같아서 설명안하려고했지만 여기서부터는 보상방법이란것을 설명할게요.

보상방법은

  10000

-          1

-------

가 있을때

  10000

-00001

--------

위숫자와 자리수를 똑같이 0을 추가하고 (10000(5) - 1(1) = 4게 0추가)

  10000

-11110

--------

1과 0을 반전시키면서 

  10000

-11111

--------

1을 더합니다. 질문자님은 여기를 햇갈린것같은데 다시확인해주세요.

  10000

+11111

--------

101111

-를 +로 바꾸고

결과의 가장왼쪽의 1을 없에면됩니다.

1

이것만으로는 예시가 부족하기때문에 문제를 풀어볼께요.

  110

-101

-----

  ???

무엇일까요?

일단확실한건 오른쪽에서 세번째숫자는 둘다 1이기때문에 지울 수 있습니다.

  010

-001

-----

  0??

다음은 오른쪽에서 첫번째숫자가 부족해보입니다. 그래서 받아야야하는데 어디서가져오냐면, 두번째숫자에서가져옵니다.

하지만 그대로 가져오면 값이 이상해지기때문에 두번째숫자인1에게 2를 곱하면서 오른쪽으로 옮겨줍니다.

  002

-001

-----

  00?

그러면 2 - 1이기때문에 정답은 1(001)입니다.

참고로 알기쉽게 설명하려고했지만 조금바꿨고

010 - 001 = 002 - 001 =  001 가아니라 원래는

010 - 001 =0010 - 001 = 001 라서 2 - 1 = 1는 아니고 10 - 1가 맞습니다.

여기까지는 꿔오는방법으로 설명했습니다.

1

안녕하세요. 저는 오버플로우같은것은 몰라서 제가 생각한대로 설명하겠습니다.

2진수     10진수

  1111     8 * 1 + 4 * 1 + 2 * 1 + 1 * 1 = 8 + 4 + 2 + 1 = 15

+0001     8 * 0 + 4 * 0 + 2 * 0 + 1 * 0 = 0 + 0 + 0 + 1 = 1

------

 10000    15 + 1 = 16     [16] 8 4 2 1니까 똑같죠?

1112       8 + 4 + 2 + 2 여기부터 생략할게요.

1120       8 + 4 + 4

1200       8 + 8

2000       16

10000    1112 = 1120 = 1200 = 2000 = 10000 = 16 라서 결국 모두 16입니다.

보기쉽게 설명하면 이렇게 됩니다.(저는 이렇게 생각하는게 이해하기 쉬웠습니다.) 여기까지는 이해하나요?

이해하면 위것을 봤을때 1112와 10000가 같다는것을 알 수 있습니다. 이것을 이해하면

 10000     16 * 1 + 8 * 0 + 4 * 0 + 2 * 0 + 1 * 0 = 16

-  0001     8 * 0 + 4 * 0 + 2 * 0 + 1 * 1 = 1

------

 1111        16 - 1 = 15

는 

 1112        8 + 4 + 2 + 2 = 16

-      1         1 = 1

------

 1111        16 - 1 = 15

와 같습니다.

설명이 너무길어 죄송합니다.

Jungwon Chu님의 프로필 이미지
Jungwon Chu

작성한 질문수

질문하기