C/C++에서 int형 오버플로우를 감지할 수 있는 방법 없을까요?

조회수 4218회

제가 한 방법 말고 더 좋은 방법 있으면 알려주세요 하드웨어에서 overflow flag가 있다고는 들었는데 C/C++에서 본 적이 없어서요

소스코드

int a, b, c;
test=a*b;
if (test/b != a) {} //오버플로우 감지 -> 적당한 처리
else c=test;      //오버플로우가 없는 경우

1 답변

  • 좋아요

    0

    싫어요
    채택 취소하기

    left-most-bit을 통해 오버플로우를 미리 감지 할 수 있습니다.

    덧셈에서는 피연산자의 최상위 비트 모두 32미만이면 오버플로우 되지 않습니다.

    bool addition_is_safe(uint32_t a, uint32_t b) {
        size_t a_bits=leftMostBit(a), b_bits=leftMostBit(b);
        return (a_bits<32 && b_bits<32);
    }
    

    곱셈에서는 피 연산자의 최상위 비트를 더한 값이 32이하면 오버플로우 되지 않습니다

    bool multiplication_is_safe(uint32_t a, uint32_t b) {
        size_t a_bits=leftMostBit(a), b_bits=leftMostBit(b);
        return (a_bits+b_bits<=32);
    }
    

    이 방법은 별로 완벽한 방법은아닙니다. a+b의 덧셈에서 a의 left-most-bit이 32이라 하더라도 b가 0이면 실제로 오버플로우되지는 않겠죠.

    하지만 오버플로우 감지에 어느정도 개념이 잡혔을거라 생각됩니다.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)