qktlf789456   3년 전

a * a = b 일때

b 가 만약에 오버플로우난다면, a보다 작을것입니다.

이것을 이용해서는 46퍼센트에서 틀린데.. 도대체 어디부분에서 반례가 난걸까요?

slah007   3년 전

오버플로우가 나고 b에서 2^31이 빠져도 a보다 큰 경우도 존재할 것 같습니다.

더 큰 자료형을 쓰는 편이 좋습니다.

qktlf789456   3년 전

잘 이해를 못했는데 조금 더 설명이 가능할까요 ㅠ

slah007   3년 전

예를 들어 int형 변수에서 오버플로우는 32개의 비트로 표현 불가능한 더 큰 수가 결과가 되어서 생깁니다. 이때 맨 위의 비트가 1이면 음수를 나타내기 때문에 음수가 나타날 '수도' 있는 식이에요.

이제 곱셈 결과 b를 밑에서부터 32비트만 잘랐을 때를 생각해 봅시다. 맨 위 32번째 비트가 0이 된다면 양수이고, 그 위 비트는 잘려서 원하는 값과 다름에도 불구하고 a보다는 큰 값일 수 있습니다.

slah007   3년 전

그래도 잘 모르시다면 오버플로우 값은 항상 음수 이런식이 아니라 그냥 신뢰할 수 없는 값 이런 느낌으로 생각하시는게 편합니다.

qktlf789456   3년 전

10000 초과인 값이 오버플로우라고 가정했을때

6 * 1667 = 10002 ( = 2) 이므로, 오버플로우가 났다고 잡겠지만

6 * 1668 = 10008 ( = 8)이므로 6 < 8 이 성립해, 오버플로우 조건에 잡히지 않는다.

이렇게 이해하는게 맞을까요?

slah007   3년 전

네 대충 그런 느낌입니다. 실제로는 이진법으로 저장되므로 1000..00은 음수인데 0110..10은 양수인 등 비트 값 하나에 따라 차이가 더 극심하게 갈리게 됩니다.

djm03178   3년 전

부호 있는 정수의 오버플로는 undefined behavior입니다. 반드시 어떤 예측할 수 있는 값이 된다는 보장이 없습니다. 오버플로가 일어나지 않는 상황만을 가정하고 컴파일러가 특이한 최적화를 할 수도 있으며, 그렇지 않다고 할지라도 예상과는 매우 다른 결과를 낼 수도 있습니다.

댓글을 작성하려면 로그인해야 합니다.