2013-04-18 1 views
0

에 가치를 다음과 같이 union 정의 :단일 기능 비교는 내가 가진

union V64 
{ 
    double f64; 
    __int64 i64; 
    unsigned __int64 u64; 
}; 

나는 다른에 대한 알 수없는 유형의 8 바이트 값의 게으른 비교 (평등과 불평등을) 할 싶습니다 공지 된 타입의 V64. i64이 두 V64 인 것을 비교하면 기본 유형에 관계없이 일관되게 예상 결과가 나옵니까? 예를 들어 값을 초과하는 경우 double's int storage (2^53 +1) 하나 f64 브레이크 다운 음수 때

V64 a.u64 << 9007199254740993+500; //pseudo-code reading raw bytes 
V64 b.u64 << -9007199254740993-501; //pseudo-code reading raw bytes 
if(a.i64 > b.i64) 
{/*do stuff*/} 

u64 나누기를 비교. i64을 비교해도 작동하는 것처럼 보이지만 고려하지 않은 경우가있을 수 있습니다.

동일한 유형의 두 멤버에 할당 한 후
+0

컴파일되지 않습니다! –

+0

사소한 부분을 삭제하기 위해 내 질문을 편집했습니다. – Phlucious

답변

4

, 당신이 그들을 비교할 수 있습니다 당신은 단지에 쓰여진 마지막으로 조합원을 읽을 수

a.f64 = 5.0; 
b.f64 = -1.0; 

if (a.f64 < b.f64) { /* ... */ } 

. 따라서 a.f64c.u64을 비교할 수 있지만 두 값 모두 double으로 올라 가게됩니다.

+0

답장을 보내 주셔서 감사합니다. 내가 마지막으로 쓴 사람 만 읽을 수 있다는 것은 무엇을 의미합니까? 몇 가지 설명을 보려면 내 질문의 수정 사항을 참조하십시오. – Phlucious

+0

@Phlucious : 비활성 조합원 (즉, 마지막으로 쓰지 않은 구성원)을 읽는 것은 정의되지 않은 동작입니다. –

+0

아, 알겠습니다. 따라서 MSVC2010에서 작동하는 것처럼 보이지만 gcc에서 작동하지 않을 수도 있습니다. 또한 예제에서 오타를 수정했습니다. – Phlucious