C ++ 복식은 64 비트인지 확인합니다
-
09-09-2019 - |
문제
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라는 비슷한 문제와 부스트 컴파일 시간 주장에 대해.