Je regarde une application en Java qui fonctionne à la fois sur des systèmes de 32 bits et de 64 bits, et elle traite principalement d'adresses IP. Ces adresses IP sont conservées en tant qu'ibervers et le type normal pour cela déteste une tonne de mémoire sur des plates-formes 64 bits (et oui, une utilisation de la mémoire a déjà été montrée comme un problème ici). Comment déclarez-vous des valeurs intégrées de 32 bits qui restent à 32bits même sur des architectures x64? P>
Comme je suis un novice Java, s'il y a un type intégré qui est déjà conçu pour gérer les adresses IP, n'hésitez pas à me montrer cela;) p>
11 Réponses :
Java a largeurs spécifiques em> pour ses types de données, pour la portabilité. Les entiers sont de 32 bits de large, même sur des plates-formes 64 bits. Le Spécification de la langue Java états très clairement (légèrement paraphrasé pour rendre plus lisible, à mon avis): p>
Les types d'intégrale sont des octets, courts, int et long, dont les valeurs sont respectivement 8 bits, 16 bits, 32 bits et 64 bits ont signé deux entiers de complément, et de char, dont les valeurs sont 16 bits nombres entiers non signés représentant des unités de code UTF-16. P>
blockQuote>
Ceci est sans doute due aux nombreux problèmes de portabilité découverts en C avec les différentes largeurs (et même des codages comme le complément de deux deux, le complément et la signer / la magnitude) des entiers que Java espérait éviter, surtout que cela était censé courir sur autant de plateformes différentes que possible. p>
sur un type intégré pour la manipulation d'adresses IP, Java a à la fois INET4ADDRESS et inet6Address < / a>, en fonction de vos besoins (et de leur ancêtre commun, Inetaddress ). P>
@JOEL Java n'a pas non signé
Le type primitif de Java Int a une taille fixe de 32 bits p>
Utilisez le type primitif et oui, une utilisation de la mémoire a déjà été montrée comme un problème ici p>
blockQuote>
Eh bien, si vous le dites. P>
Nous ne savons pas ce que vous faites ici. Mais si vous êtes préoccupé par l'utilisation de la mémoire en représentant un énorme nombre d'adresses IP en mémoire, vous devez peut-être: P>
ou peut-être que vous venez de gagner de la mémoire "gaspillage" hors de proportion. Java est intrinsèquement la mémoire affamée et la réponse pragmatique est de le laisser avoir ce qu'il veut. P>
Suivi STRUT> P>
Java n'a pas de type non signé (Et même si vous l'avez fait, il existe des moyens de le faire. N'oubliez pas que si vous voulez presser la dernière once de mémoire "gaspillage" d'une application Java, vous aurez besoin de faire des choses laides .) p> int code>. Il est 32 bits sur toutes les plates-formes Java; Voir JLS 4.2.1 . < / p>
int code>. Mais vous n'avez pas besoin de représenter les adresses IP, notamment parce que vous n'avez pas besoin de faire de l'arithmétique sur eux. p>
"int" / "INTEGER" en Java n'est pas dépendant de la plate-forme. C'est toujours 32 bits. La plate-forme dépendante de l'une est com.sun.jna.ptr.Interference. P>
de http://java.sun.com.com /docs/books/jls/second_edition/html/typesvalues.doc.html : p>
Les types d'intégrale sont des octets, courts, int, et long, dont les valeurs sont 8 bits, Signé 16 bits, 32 bits et 64 bits des entiers de deux complément, respectivement et char, dont les valeurs sont des entiers non signés de 16 bits représentant des caractères unicode. p> blockQuote>
donc
int code> est déjà 32 bits par définition, bien que l'interprète puisse la mettre sur une limite de 64 bits en mémoire afin d'accélérer l'accès. P>
dans Java Ints sont déjà 32 bits. Les longs sont 64 bits. P>
http://download.oracle.com/javase/tatutorial/ Java / Nutsandbolts / DataTypes.html P>
Ne vous inquiétez pas, le type int code> Java est défini (Contrairement à C / C ++) pour être exactement 32 bits, comme mentionné ici . p>
int code> est 32 bits sur chaque plate-forme. Cependant, pour le rendre non signé, vous devez modifier manuellement les numéros et ces trucs - cela est vraiment compliqué. Pourquoi ne pas utiliser un octet [] ou une longue? P>
L'INT sera 32bits, même sur des machines de 64 bits, vous n'avez rien à faire. P>
de la spécification de langue java ( http://download.oracle. COM / Javase / Tutorial / Java / NutSandbolts / DataTypes.html ) P>
Le type de données INT est un entier de complément de deux 3 de 32 bits. Il a une valeur minimale de -2 147,483 648 et une valeur maximale de 2 147 483 647 (inclus). Pour des valeurs intégrales, ce type de données est généralement le choix par défaut. Ce type de données sera probablement suffisamment important pour les chiffres que votre programme utilisera, mais si vous avez besoin d'une plage de valeurs plus large, utilisez plutôt longtemps. P> blockQuote>
La principale différence entre VMS Java de 32 bits et 64 bits est la taille maximale du tas, c'est-à-dire la quantité de mémoire que le VM peut gérer. P>
Cependant, la mise en œuvre interne de 64 bits de VMS aura une incidence sur l'utilisation de la mémoire: p>
En règle générale, les avantages de pouvoir traiter de plus grandes quantités de mémoire sont accompagnées d'une petite perte de performance dans des ordinateurs virtuels de 64 bits par rapport à la même application sur un VM 32 bits. Cela est dû au fait que chaque pointeur natif du système prend 8 octets au lieu de 4. Le chargement de ces données supplémentaires a un impact sur l'utilisation de la mémoire qui se traduit par une exécution légèrement plus lente en fonction du nombre de pointeurs chargés pendant l'exécution de votre programme Java. P> blockQuote>
de: http://www.oracle.com/techNetwork/ Java / hotspotfaq-138619.html # 64bit_description P>
dans Java Int est 32 bits. Les longs sont 64 bits. Donc, si cela est supérieur à 32 bits, vous avez besoin de longs. P>
meilleure façon de faire cela est importe de nouvelles bibliothèques
Je pensais
int code> en Java est de 32 bits ?!
@Arak - Peut-être que c'est, mais je ne suis pas sûr de ne pas échoue à 64bits sur des systèmes X64 et je ne vois pas une réponse définitive dans les documents.
Ou plutôt, je le vois pour INT, mais aucune référence nulle part pour non signé b> int.
@Joel Java n'a pas de types non signés; ils les ont laissés à "éviter la confusion"
Pourquoi avez-vous besoin de non signé? Devrait faire des opérateurs de décalage non signés dans Java sur des entiers signés.
Java ne vous laissera pas penser à non signé. C'est un bug.
@Joel Coehoorn: Référence utile: darksleep.com/player/javaandunsignedtypes.html
C'est ce que je n'aime pas sur ce site. Des questions comme ceci obtiennent 9 (!!!) réponses. Gens! Qu'est-ce qui ne va pas?
@Dimitris pourquoi ne devrait pas i> cette question a des réponses? Ou beaucoup d'entre eux? Les boutons de vote sont là pour une raison ...
@Santa, il devrait avoir une seule réponse, trois caractères de long. Tout ce qui est au-delà de cela n'est que le bruit et il est plutôt éclairant que programmeurs i> sont tellement enclins à une telle verbosité.