2012-07-16 81 views
5

Necesito una forma de arquitectura cruzada para asegurar que un flotante tenga 4 bytes (como en las ventanas de 32 bits). Por ejemplo, en las estructuras que estoy creando, estoy usando en lugar de int para asegurar un valor entero de 4 bytes de longitud.C++ asegurando un tamaño flotante de 4 bytes

¿Cómo podría hacer esto con un flotador? Sé que puedo simplemente sustituir el valor con un tipo ; sin embargo, cuando se lanza a flotante en sistemas de 64 bits, ¿no tendré problemas?

+5

El estándar ni siquiera garantiza que exista un "flotador" de 4 bytes. Sin embargo, me imagino que sería extremadamente difícil encontrar una arquitectura donde 'sizeof (float)! = Sizeof (int32_t)'. – Mysticial

+2

Tengo malas noticias: '__int32' no es multiplataforma. –

+4

* A un lado *: '__int32' no se garantiza que exista en todos (o en cualquier) sistema. Pruebe 'int32_t' en su lugar. –

Respuesta

7

Necesito una forma de arquitectura cruzada para asegurar que una flotador será de 4 bytes

no hay análogo a int32_t para los valores de punto flotante.

La única forma de plataforma cruzada para lograr lo que desea es probarla con tiempo de ejecución o afirmaciones estáticas.

#include <cassert> 
int main() { 
    assert(sizeof(float) == 4); 
    // If control reaches this line, then you've 
    // ensured that float is 4 bytes. 


    // rest of your program goes here 
} 
+2

Eso simplemente mata el programa si el tamaño no es de 4 bytes .. – Qix

+0

Derecha. ¿Qué quieres que haga si 'float' no tiene 4 bytes? –

+0

I * necesito * que el flotador sea de 4 bytes. – Qix

3

No hay una forma estándar de hacerlo porque el tamaño de datos de coma flotante está vinculado a la CPU. El estándar IEEE-754 (que todos los procesadores que admiten el uso de coma flotante) define un valor de coma flotante de precisión simple como 4 bytes.

La razón por la que no hay una mención estándar es porque los escritores de C no desean vincularse a una implementación específica de punto flotante, en caso de que el estándar cambie o se actualice. Y también porque la CPU determina los tamaños y la implementación de flotantes de precisión simple y doble de todos modos, por lo que no es algo que preocupe al compilador.

Si le preocupa, puede usar static_assert para asegurarse de que sizeof(float) == 4; sin embargo, este no es un problema con el que te encontrarás, no me lo imaginaba. Y si es así, debe tratarlo caso por caso (que realmente va a ser una arquitectura por arquitectura).

+0

Eso tiene sentido. Tendré que leer más sobre el estándar IEEE-754 (todos siempre critican estos estándares, pero aún estoy tratando de entender qué son y cómo se relacionan entre sí). – Qix

+0

Si todavía estás cerca, probablemente deberías dar la respuesta aceptada a Rob-phi. Me expandí de su respuesta. – OmnipotentEntity

Cuestiones relacionadas