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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top