2011-04-04 18 views
8

Cuando doy sizeof(a), donde a=13.33, una variable flotante, el tamaño es de 4 bytes. Pero si doy sizeof(13.33) directamente, el tamaño es de 8 bytes.¿por qué sizeof (13.33) tiene 8 bytes?

No entiendo lo que está sucediendo. ¿Alguien puede ayudar?

+13

Amigo, deje de agregar y eliminar la etiqueta 'math' para encontrar esta pregunta en la parte superior. – Xeo

+1

intente 13.ff en su lugar y también consulte este enlace http://stackoverflow.com/questions/2331751/does-the-size-of-an-int-depend-on-the-compiler-and-or-processor –

+0

[¿Por qué el valor de coma flotante como 3.14 se considera como el doble de forma predeterminada en MSVC?] (Https://stackoverflow.com/q/4353780/995714) –

Respuesta

44

Esas son las reglas del lenguaje.

13.33 es un literal numérico. Se trata como un doble porque es un doble. Si quiere que 13.33 sea tratado como un literal flotante, entonces declara 13.33f.

13.33 es un doble literal. Si sizeof (float) == 4, sizeof (13.33f) == 4 también debería mantenerse porque 13.33f es un literal flotante.

19

El literal 13.33 se trata como un valor de coma flotante de doble precisión, 8 bytes de ancho.

+2

Para marcar explícitamente un número literal como un solo float de precisión, intente '13.33f '. 'sizeof (13.33f)' devuelve el 4 esperado. –

13

El literal 13.33 está siendo tratado como 'doble', no 'flotante'.

Pruebe 13.33f en su lugar.

8

Porque 13.33 es double, que se trunca en float si lo asigna. Y un double es 8bytes. Para crear un flotador real, use 13.33f (observe el f).

9

El tipo y el tamaño de su variable están bien. Es solo que el compilador tiene algunos tipos predeterminados para literales, esos valores constantes codificados en su programa.

Si solicita sizeof(1), obtendrá sizeof(int). Si solicita sizeof(2.5), obtendrá sizeof(double). Esos encajarían claramente en un char y un flotador, respectivamente, pero el compilador tiene tipos predeterminados para sus literales y los tratará como tales hasta la asignación.

Sin embargo, puede anular este comportamiento predeterminado. Por ejemplo:

2.5 // as you didn't specify anything, the compiler will take it for a double. 
2.5f // ah ha! you're specifying this literal to be float 

¡Salud!

Cuestiones relacionadas