문제

C ++ 프로그램에서는 외부 바이트 시퀀스에서 64 비트 플로트를 가져와야합니다. 컴파일 타임에 두 배가 64 비트임을 보장 할 수있는 방법이 있습니까? 대신 데이터를 저장하는 데 사용해야 할 다른 유형이 있습니까?

편집 : 당신이 이것을 읽고 있다면 실제로 IEEE 754 형식의 스토리지를 보장하는 방법을 찾고, 아래의 Adam Rosenfield의 답변을 살펴보십시오.

도움이 되었습니까?

해결책

다른 답변에 대한 개선 (숯이 8 비트라고 가정하면 표준이이를 보장하지는 않습니다.). 다음과 같을 것입니다.

char a[sizeof(double) * CHAR_BIT == 64];

또는

BOOST_STATIC_ASSERT(sizeof(double) * CHAR_BIT == 64);

정의 된 char_bit을 찾을 수 있습니다 <limits.h> 또는 <climits>.

다른 팁

C99에서는 전처리 기호가 있는지 확인할 수 있습니다. __STDC_IEC_559__ 정의됩니다. 그것이 있다면, 당신은 double IEEE 754 (IEC 60559라고도 함) 형식으로 표시되는 8 바이트 값입니다. C99 표준, 부록 F를 참조하십시오. 그러나이 기호가 C ++로 제공되는지 확실하지 않습니다.

#ifndef __STDC_IEC_559__
#error "Requires IEEE 754 floating point!"
#endif

또는 사전 정의 된 상수를 확인할 수 있습니다 __DBL_DIG__ (15 살이어야 함), __DBL_MANT_DIG__ (53이어야 함), __DBL_MAX_10_EXP__ (308이어야 함), __DBL_MAX_EXP__ (1024 여야합니다), __DBL_MIN_10_EXP (-307이어야한다) __DBL_MIN_EXP__ (-1021이어야한다). 이들은 C 및 C ++의 모든 풍미에서 사용할 수 있어야합니다.

확인하다 std::numeric_limits< double >::is_iec559 C ++ 구현이 표준 복식을 지원하는지 여부를 알아야하는 경우. 이는 총 비트 수가 64 일뿐 만 아니라 더블 내부의 모든 필드의 크기와 위치를 보장합니다.

나는 당신이 더블의 "원시 크기"(일반적으로 64 비트가 아니라 80 비트)에 초점을 맞추어야한다고 생각하지 않습니다.

numeric_limits :: digits10 덕분에 이것은 매우 쉽습니다.

당신은 사용할 수 있습니다 정적 어설 션을 향상시킵니다 이것을하기 위해. 를보세요 네임 스페이스 범위에서 사용하십시오 예시.

부스트가없는 솔루션은 배열을 그렇게 정의하는 것입니다.

char a[ 8 == sizeof(double) ];

더블이 64 비트가 아닌 경우 코드는 다음과 같습니다.

char a[0];

컴파일 타임 오류입니다. 이 지침 근처에 적절한 의견을 넣으십시오.

보다 이 게시물 CCASSERT라는 비슷한 문제와 부스트 컴파일 시간 주장에 대해.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top