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?

¿Fue útil?

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;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top