2010-07-21 3 views
2

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 ...)

Répondre

6

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 ...

+0

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

+0

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

+0

Donc, cela fonctionnerait-il? long'' à la place? – JohnK

0
whatever_your_int_var_name_is = (int)whatever_your_uint64_t_var_name_is; 
2

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.

6

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 */ 
3

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.

+0

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

+2

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. –

0

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 ...

+0

'jlong' semble convenir parfaitement à votre objectif. –