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.