Hoy tengo una pregunta extraña.Unión C++ para representar la memoria de datos frente a la variable escalar C tipo
El código (C++)
#include <iostream>
union name
{
int num;
float num2;
}oblong;
int main(void)
{
oblong.num2 = 27.881;
std::cout << oblong.num << std::endl;
return 0;
}
El código (C)
#include <stdio.h>
int main(void)
{
float num = 27.881;
printf("%d\n" , num);
return 0;
}
La pregunta sindicatos
Como sabemos, C++ pueden hol d más de un tipo de elemento de datos, pero solo un tipo a la vez. Así que, básicamente, el
name oblong
solo reservará una parte de la memoria que es de 32 bits (porque el tipo más grande en la unión es de 32 bits, int y float) y esta parte podría contener un número entero o flotar.Así que solo asigno un valor de 27.881 en
oblong.num2
(como se puede ver en el código anterior). Pero por curiosidad, accedo a la memoria usandooblong.num
que apunta a la misma ubicación de memoria.Como era de esperar, me dio un valor que no es 27, porque la forma de flotador y número entero representado dentro de una memoria es diferente, por eso cuando uso
oblong.num
acceder a la parte de memoria que va a tratar esa parte de valor de la memoria como entero e interpretarlo usando la forma de representación entera.Sé que este fenómeno ocurrirá también en C, es por eso que inicializar una variable de tipo float con un valor y más tarde leí utilizando el
%d
.So Sólo trato a cabo utilizando el mismo valor27.881
las cuales se puede véase más arriba. Pero cuando lo ejecuto, sucede algo raro, ese es el valor de lo que obtengo en C es diferente de C++.¿Por qué sucede esto? Por lo que sé, los dos valores que obtengo de los dos códigos al final no son valores basura, pero ¿por qué obtengo valores diferentes? También uso el sizeof para verificar el entero y el flotador de C y C++, y ambos son de 32 bits. Entonces, el tamaño de la memoria no es el que causa que esto suceda, entonces, ¿qué es lo que provoca esta diferencia en los valores?
Mismo caso: http://stackoverflow.com/questions/2377733/how-does-this-program-work y esto también: http://stackoverflow.com/questions/2398791/how-is-conversion- of-float-double-to-int-handled-in-printf –
La diferencia no es C versus C++. También puede compilar el segundo ejemplo en C++ y obtener el mismo resultado de C y C++. El primer ejemplo con 'union' necesitaría un pequeño cambio para usar' printf', en lugar de 'std :: cout <<', pero después obtendría los mismos resultados de C y C++ nuevamente. – MSalters