vida transitivas transitiva simétrica simetricas resueltos relaciones reflexivas reflexiva propiedades las irreflexiva funciones ejercicios ejemplos diaria binarias asimétrica antisimétrica c binary double bit-manipulation arc4random

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.