J'écris un java obligatoire pour un code C et je ne suis pas vraiment familier avec C.uint64_t à int
J'ai uint64_t et besoin de le jeter à un int. Est-ce que quelqu'un sait comment faire ça? (Ma liaison renvoie alors un jint ...)
J'écris un java obligatoire pour un code C et je ne suis pas vraiment familier avec C.uint64_t à int
J'ai uint64_t et besoin de le jeter à un int. Est-ce que quelqu'un sait comment faire ça? (Ma liaison renvoie alors un jint ...)
Habituellement, en utilisant une largeur exacte entière comme 'uint64_t' est pour une bonne raison. Si vous lancez à un int, qui ne peut être 64bits longue, vous pouvez avoir des problèmes graves ...
whatever_your_int_var_name_is = (int)whatever_your_uint64_t_var_name_is;
Notez que java ne supporte pas les types non signés. Le type le plus proche dans Java sera long, puisqu'il a aussi 64 bits. Lancer uint64 à long ne perd pas de données car le nombre de bits est le même, mais les grandes valeurs seront affichées sous forme de nombres négatifs.
La réponse courte:
uint64_t foo;
int bar;
bar = foo;
Techniquement, cela a un comportement non défini si la valeur de foo
ne rentre pas dans un int
. En pratique, il tronquera toujours simplement les bits supérieurs. Si vous voulez être plus correct, alors:
if (foo-INT_MIN <= (uint64_t)INT_MAX-INT_MIN)
bar = foo;
else
/* error case here */
Si vous écrivez wrappers JNI, le meilleur match pour uint64_t est longue, pas int. Même alors, vous perdrez de la précision, car Java n'a pas de types non signés (d'où le u), et vous devez être prêt à vérifier le signe de la valeur.
est-il un moyen de stocker le uint64_t de C en Java? Dans mon cas, l'uint64_t est toujours un nombre positif – mkn
Si vous voulez que uint64_t * juste * le passer à java comme un identifiant (et revenir à C), utilisez un long - il n'y aura pas de dégradation, mais les valeurs plus grand que 2^63 deviendra négatif - long a 64 bits par définition, mais utilise un peu comme signe. –
hm ... J'ai une méthode en C qui retourne un identificateur de page qui est un nombre uint64_t. Maintenant, j'ai besoin de stocker ce numéro dans un Java HashMap. Alors quelle est la meilleure façon de stocker ce uint64_t dans le Java HashMap? Le problème est que lorsque je fais une recherche, j'ai besoin de prendre cette valeur spécifique dans la HashMap et de la renvoyer à uint64_t pour que je puisse appeler une fonction dans le code C, qui attend un uint64_t comme argument.
P.S. Je l'ai fait avec jlong pid = (jlong) pid_in_uint64_t; si loin si bon ...
'jlong' semble convenir parfaitement à votre objectif. –
Alors, que peut-on faire pour éviter les problèmes? Ou 'uint64_t' est-il équivalent à un' int' partout où il peut être utilisé? – JohnK
La taille d'un 'int' dépend de l'implémentation. Sur les ordinateurs d'aujourd'hui, il s'agit généralement de 32 bits, mais cela pourrait être n'importe quoi ... Donc, convertir un 'uint64_t' en un' int' pourrait bien se traduire par un entier tronqué ... – Macmade
Donc, cela fonctionnerait-il? long'' à la place? – JohnK