2012-07-31 4 views
8

나는 가수와 부호없는 값을 비교해야하는 시점에 도착했습니다. 지금까지이 상황을 완전히 피하기 위해 코드베이스를 수정했지만 지금은 그렇게 할 수 없습니다.부호있는 값과 부호없는 값의 비교를 올바르게 처리하기

그래서 노래 및 서명되지 않은 비교를 처리하는 데 실제로 적절한 방법은 무엇입니까? 이것은 혼합 된 C/C++ 코드 기반이므로 제 질문은 두 언어 모두에 적용됩니다.

요청한 값 (서명되지 않은)에 대해 리소스 (서명 됨)를 확인하고 있습니다.

if (requested > (unsigned)INT_MAX) bail_out(); // assert,abort,throw,return.... 
if ((signed)requested > resource.max) return Never; 
if ((signed)requested > resource.free - resource.assigned) return NotNow; 
return Now; 

내가 올바르게 접근하고 있는가, 또는 더 좋은 방법이있다 :

if (requested > resource.max) return Never; 
if (requested > resource.free - resource.assigned) return NotNow; 
return Now; 

나는이 (해당 변형 ++ 대체 C)처럼 뭔가에 대해 생각했다?

당신은 출발점으로이 한 줄의 코드를 사용할 수 있습니다
+0

리소스 개수가 처음으로 서명되는 이유는 무엇입니까? –

+1

'resource.free

+1

또는 OP가 서명 된 것으로 취급하고자하는 값이기 때문에 서명되지 않은 이유는 무엇입니까? 어쨌든이 접근법은 나에게 좋을 것 같다. 이런 종류의 물건들은 너무 지루해서 나는 서명되지 않은 타입들을 완전히 피하는 경향이있다. – jahhaj

답변

9

안전하게 작업을 수행합니다 :

bool GreaterSignedUnsigned(unsigned int u, signed int i) 
{ 
    // calculate the result of (u > i) 

    // if i is nonnegative it is safe to compare 2 unsigned values, 
    // otherwise unsigned int is always greater 
    return (i < 0) || (u > static_cast<unsigned int>(i)); 
} 

P.S.을 추가 비교 및 ​​캐스트로 인해 성능 손실이 발생할 수 있으므로 가능한 한 서명/서명되지 않은 혼합 비교를 피하는 것이 좋습니다.

관련 문제