Assegurar duplas C ++ são 64 bits
-
09-09-2019 - |
Pergunta
Na minha programa C ++, preciso puxar um flutuador 64 bits de uma sequência de bytes externo. Existe alguma maneira de garantir, em tempo de compilação, que duplos são 64 bits? Existe algum outro tipo devo usar para armazenar os dados em vez disso?
Edit:. Se você está lendo isso e realmente procurando uma maneira de garantir o armazenamento no formato IEEE 754, ter um olhar para a resposta de Adam Rosenfield abaixo
Solução
Uma melhoria nas outras respostas (que assumem um char é de 8-bits, o padrão não garante isso ..). Seria assim:
char a[sizeof(double) * CHAR_BIT == 64];
ou
BOOST_STATIC_ASSERT(sizeof(double) * CHAR_BIT == 64);
Você pode encontrar CHAR_BIT definido no <limits.h>
ou <climits>
.
Outras dicas
Em C99, você pode apenas verificar se o símbolo de pré-processador __STDC_IEC_559__
está definida. Se for, então você está garantido que um double
será um valor de 8 bytes representado com IEEE 754 (também conhecido como IEC 60559) formato. Veja o padrão C99, anexo F. Eu não tenho certeza se este símbolo está disponível em C ++, no entanto.
#ifndef __STDC_IEC_559__
#error "Requires IEEE 754 floating point!"
#endif
Como alternativa, você pode verificar as constantes __DBL_DIG__
predefinidos (deve ser 15), __DBL_MANT_DIG__
(deve ser 53), __DBL_MAX_10_EXP__
(deve ser 308), __DBL_MAX_EXP__
(deve ser 1024), __DBL_MIN_10_EXP
(deve ser -307) e __DBL_MIN_EXP__
( deve ser -1.021). Estes devem estar disponíveis em todos os sabores de C e C ++.
Verifique std::numeric_limits< double >::is_iec559
se você precisa saber se o seu C ++ apoia a implementação duplos. Isto garante não só que o número total de bits é 64, mas também o tamanho ea posição de todos os campos dentro do casal.
Eu não acho que você deve focar o "tamanho raw" de sua dupla (que geralmente é de 80 bit, e não de 64 bits), mas sim em sua precisão.
Graças à numeric_limits :: digits10 este é bastante fácil.
Você pode usar o impulso estáticos para fazem isto. Olhe para a Use a namespace escopo exemplo.
A solução sem impulso é definir a matriz como tal
char a[ 8 == sizeof(double) ];
Se o casal não é 64 bits, em seguida, o código irá se parece com
char a[0];
que é um erro tempo de compilação. Basta colocar o comentário apropriado mais perto esta instrução.
este post para um problema semelhante e um não-boost de compilação tempo de afirmação chamado CCASSERT.