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


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

소스코드

int a, b, c;
test=a*b;
if (test/b != a) {} //오버플로우 감지 -> 적당한 처리
else c=test;      //오버플로우가 없는 경우
  • 2016년 01월 05일에 작성됨

조회수 307


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이면 실제로 오버플로우되지는 않겠죠.

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

  • 2016년 01월 05일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close