|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Candidat au titre de Membre du Club
![]() Inscription : décembre 2009 Messages : 27 ![]() |
Bonsoir,
Dans le cadre d'un projet, je dois réalisé une appli Java qui communique avec plusieurs matériels via JNI. Du coup, j'ai besoins de travailler en unsigned pour pas mal de chose. La plupart du temps, j'utilise le type "byte" (8bits signé). Mais j'ai un problème... Code :
Quelqu'un peut m'expliquer pourquoi la valeur de "-1" tient sur 32 bits??? J'avoue que je comprends pas car je m'attendrais à une valeur de "11111111" (sur 8 bits). Merci d'avance
|
||
|
|
00
|
|
|
#2 |
![]() ![]() |
Integer.toBinaryString convertit un int, pas un byte, ton byte de -1 est donc promo d'abord en integer, donc étendu à 32 bits.
Utilise Integer.toBinaryString(byte & 0xFF) pour n'avoir que les 8 bits de base.
__________________
⥀⥁ Чиз faq java, cours java, javadoc. Pensez à et ![]() "Votre génitrice tute des pédoncules au pandémonium" (le conjurateur, 1973) |
|
|
10
|
|
|
#3 | |
|
Expert Confirmé Sénior
![]() Inscription : septembre 2004 Messages : 5 092 ![]() |
Citation:
-1 est une valeur de byte parfaitement correcte, et donc tient en effet sur 8 bits. Seulement, Integer.toBinaryString() ne traite que des ints, et les ints occupent 32 bits. |
|
|
|
00
|
|
|
#4 | ||||
|
Candidat au titre de Membre du Club
![]() Inscription : décembre 2009 Messages : 27 ![]() |
Merci pour l'explication, j'avais zappé la conversion en integer...
J'ai toutefois une autre question: J'essaie d'utiliser des unsigned integer, du coup, mon raisonnement est le suivant. Code :
En gros, mon "value" vaut : 11100000001110101110110000000010 Une fois passer en "long", il devrait valoir: 11111111111111111111111111111111 11100000001110101110110000000010 Je devrais pouvoir extraire la valeur positive grâce à "&0xFFFFFFFF". Code :
Merci encore une fois pour votre aide |
||||
|
|
00
|
|
|
#5 | |||||
|
Membre habitué
![]() Gilles Inscription : août 2011 Messages : 46 ![]() |
Citation:
Edit : faut que je compte les F D'abord >< Edit2 : pourquoi tu n'affectes pas directement à un long ? |
|||||
|
|
00
|
|
|
#6 | |||
|
Candidat au titre de Membre du Club
![]() Inscription : décembre 2009 Messages : 27 ![]() |
Citation:
En faite j'ai trouvé Code :
|
|||
|
|
10
|
|
|
#7 | |
|
Expert Confirmé Sénior
![]() Inscription : septembre 2004 Messages : 5 092 ![]() |
Citation:
0xffffffff est un int, dès le départ. Un int qui vaut -1. Lorsque Java voit une expression qui mêle des ints et des longs, comme Avec value de type long, et 0xffffffff de type intrinsèque int, Java décide que l'expression est de type le plus large : long. Il commence donc par élargir les types ints vers le type long. Donc il élargit 0xffffffff vers le type long. Valeurs en tant que int : -1. Donc valeur en tant que long : -1. Donc après conversion en long, il n'y a toujours que des 1, et donc appliquer un & dessus n'a aucun effet. En utilisant 0xffffffffL, c'est un long dès le départ, et c'est lui qui fait en sorte que l'expression soit de type long. Il n'a pas besoin d'être converti, et va effectivement faire passer tous les 32 bits de poids fort à zéro. |
|
|
|
00
|
|
|
#8 |
![]() ![]() |
La question étant plutot, a part l'affichage qui vous gène (et peux donc être corrigé à l'affichage), pourquoi avoir besoin de "unsigned"?
__________________
⥀⥁ Чиз faq java, cours java, javadoc. Pensez à et ![]() "Votre génitrice tute des pédoncules au pandémonium" (le conjurateur, 1973) |
|
|
00
|
|
|
#9 | |
|
Candidat au titre de Membre du Club
![]() Inscription : décembre 2009 Messages : 27 ![]() |
Citation:
Du coup, j'ai besoins de bien comprendre comment fonctionne Java au niveau des différents types qu'il offre. Dans le cas présenté ici, c'est uniquement pour avoir le bon affichage comme si c'était un unsigned (même si en faite on place la valeur dans une variable plus grande pour que le bit de signe ne soit pas interprété). On pourrait croire que signed ou unsigned, peut importe car au niveau binaire ça ne change rien, mais c'est faux ! Le faite que le type unsigned n'existe pas en Java pose des problèmes lorsqu'on passe d'un type à un autre avec des variables dont le MSB est à 1. En effet, pour que la valeur soit toujours négative, des "1" sont rajoutés dans certains cas. Du coup, lorsque l'on s'amuse avec des masques et des shift et qu'on ne connait pas forcément comment Java fonctionne, on se retrouve avec des "castings implicite" en "int" qui rajoute des "1" et qui peuvent perturber nos calcules. Le problème est aussi présent lorsque l'on shift à droite si on utilise pas le bonne opérateur (">>>" au lieu de ">>"). Entre temps et en faisant pas mal de test, je suis tombé sur ce site qui explique comment fonctionne Java avec les opérateurs de "shiftage". Dans mon cas précis, l'appli devra tourner sur un système embarqué peu puissant. Et je dois convertir des tableaux de byte (big-endian ou little-endian) en d'autres types. C'est pour ça que je n'utilise pas de ByteBuffer par exemple, car après avoir fait un petit benchmark, il s'était avérer qu'un ByteBuffer étant 100x plus lent qu'en faisant le traitement à la main (ET/OU logique, masque et shift). Bref, c'est des choses à savoir (que je ne savais pas) si on veut traiter/modifier des valeurs "raw" pour les rendre "utilisable" par la suite. En tout cas merci beaucoup de votre aide, j'ai acquis des connaissances qui me sont très utiles
|
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com