Obj C Equivalente a Double.doubleToLongBits
-
29-09-2019 - |
Pregunta
Estoy portar algo de código Java a C Objetivo y sé lo suficiente a nivel de bits para obtener un dolor de cabeza. ¿Puede alguien me punto a los equivalentes a ObjC Double.doubleToLongBits y Float.floatToIntBits?
Solución
No hay manera segura para asignar los bits de un double
a un long
en C. Objetivo
En Java, long
y double
son ambos 64bits. En algunos casos, para Objective C, long
es de 32 bits y de 64 bits es double
.
Se debe utilizar long long
lugar.
int intValue = *((int*)(&floatValue));
long long llValue = *((long long*)(&doubleValue));
Otros consejos
jojoba ha señalado, long
no se garantiza que sea de 64 bits de ancho (a pesar de que es un error decir que se trata de 32 bits - long
es de 64 bits de ancho en Objective-C en plataformas de 64 bits ). Dicho esto, me gustaría utilizar un tipo de ancho fijo real en lugar de long long
.
#include <stdint.h>
uint64_t doubleToBits(double x) {
const union { double f; uint64_t i; } xUnion = { .f = x };
return xUnion.i;
}
uint32_t floatToBits(float x) {
const union { float f; uint32_t i; } xUnion = { .f = x };
return xUnion.i;
}