Obj C équivalent à Double.doubleToLongBits
-
29-09-2019 - |
Question
Je suis PORTAGE du code Java pour Objective C et savoir assez pour obtenir un bitwise maux de tête. point que quelqu'un peut me les équivalents objc à Double.doubleToLongBits et Float.floatToIntBits?
La solution
Il n'y a pas de moyen sûr d'affecter les bits d'un double
à un long
en Objective C.
En Java, long
et double
sont tous deux 64bits. Dans certains cas, pour Objective C, long
est 32bit et double
est 64bit.
Vous devez utiliser long long
à la place.
int intValue = *((int*)(&floatValue));
long long llValue = *((long long*)(&doubleValue));
Autres conseils
Jojoba noté, long
n'est pas garanti 64 bits de large (mais il est faux de dire qu'il est 32 bits - long
est de 64 bits de large en Objective-C sur les plates-formes 64 bits ). Cela dit, je voudrais utiliser un type largeur fixe réelle au lieu 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;
}