transitivas - relaciones binarias ejemplos
Crear doble añadiendo representaciones binarias de dos entradas (3)
Intento crear un double agregando las representaciones binarias de dos int s. Esto es lo que tengo ahora:
int i = arc4random();
*(&i+1) = arc4random();
double d = *(double*)&i;
Esperaba que el double puntero también utilizara el valor en la dirección &i+1 , y este es realmente el caso. Cuando imprimo las representaciones binarias de i y *(&i+1) y las comparo con la representación binaria de d , d se compone añadiendo *(&i+1) e i . Entonces *(&i+1) viene primero ?! ¿Por qué es este el caso?
EDITAR: también echa un vistazo a las respuestas de Juan Catalán y Mark Segal para saber cuál es la forma correcta de hacer lo que hice con los sindicatos.
Cuando imprimo las representaciones binarias de i y * (& i + 1) y las comparo con la representación binaria de d, d se compone añadiendo * (& i + 1) e i. Entonces * (& i + 1) viene primero ?! ¿Por qué es este el caso?
el orden real de los bytes depende de la ''Endianidad'' de la arquitectura de hardware subyacente.
con poca arquitectura Endian:
1) the lowest address byte contains the least significant 8 bits of the total variable
2) the highest address byte contains the most significant 8 bits of the total variable.
Use una union lugar. Aún puede generar un NaN pero no tendrá problemas de administración de memoria.
Este es el propósito de una union , compartir un bloque de memoria entre varios tipos diferentes.
Asegúrese de que en su arquitectura sizeof(double) es igual a dos sizeof(int)
Usted podría usar una unión, así:
typedef union {
double d;
struct {
int a;
int b;
} integers;
} double_generator;
int main(void) {
double_generator g;
g.integers.a = arc4random();
g.integers.b = arc4random();
// g.d is now a "randomly generated double"
return 0;
}
O "manualmente", posiblemente inseguro, haga el trabajo usted mismo:
int main(void) {
double d;
*((int *)&d) = arc4random();
*(((int *)&d) + 1) = arc4random();
printf("%f", d);
return 0;
}
En ambos casos, simplemente direcciona la misma memoria como si fuera int o double . Esto podría generar todos los valores double posibles, incluidos NaN o Infinity .
Sin embargo, este código supone que sizeof(double) es (al menos) el doble de sizeof(int) . Si no es así, debe introducir un código diferente para manejarlo.