2010-03-26 1 views
-1

"Unsigned int" dans un court et arrière. Est-ce possible? Comment le faire si oui?En java est-il possible d'empaqueter un nombre entier qui ne devrait pas être négatif et être final (pas débordement) dans un court?

Grrrr. J'ai oublié comment les nombres signés sont implémentés. la question n'as pas de sens. Merci quand même. J'allais me déprécier, vous pouvez le faire à la place.

+0

un 'unsigned int' n'a pas de sens en java. Vous pouvez soit parler d'un entier qui n'a que des valeurs 'positives', mais toujours dans la plage int (un nombre de 31 bits), ou un entier non signé de 32 bits, qui a une plage de 0 -> (MAX_INT * 2) sur Java. Aucun ne rentrera dans un short java. Un short java est toujours un nombre signé, avec une valeur max de 2^15-1 – Kylar

Répondre

1

Je ne suis pas sûr que je comprends très bien la question, mais si vous êtes sûr que votre ajustement int dans un court (vous nombre est compris entre 0 et 2^16), vous pouvez toujours jeter votre int à un court:

int i = 65536; 
short s = (short) i; 

Et pour obtenir la valeur non signée retour: int i2 = s & 0xFFFF; System.out.println (i2);

Le s & 0xFFFF convertira s en int et le masque de bits convertira le nombre négatif en valeur non signée (sorte de). Rappelez-vous que FFFF dans une variable courte -1 pas 65536.

+0

Merci, cela fonctionnera, sur une portée réduite mais il semble le meilleur possible. – i30817

0

Si votre numéro entier n'a pas caractéristique spécifique comme étant un multiple de quelque chose que je ne pense pas que vous pouvez.

Le problème est que l'information contenue dans un int, qui est généralement l'architecture 32 bits ne peut pas être contenu dans un court.

Comme vous pouvez le voir Short.MAX_VALUE tha valeur maximale est 2^15-1, depuis peu 16 bits .. occupe donc vous perdez réellement précision et vous ne pouvez pas exprimer des entiers comme 2²² ..

+0

Je suis prêt à risquer dans ce cas une plage supérieure légèrement réduite. – i30817

1

Ressemble vous espérez un type de base qui fera le travail pour vous, mais je ne pense pas qu'il existe. D'un autre côté, je n'imagine pas qu'il serait trop difficile de créer un objet qui fasse le travail. Ajuster si nécessaire pour faire un court.

 
public class SpecialInt { 
int i = 0; 

public void set(int i) { 
    if (i < 0) throw new IllegalArgumentException("cannot be negative"); 
    this.i = i; 
} 

public void add(int j) { 
    int t = i+j; 
    if(t < i) throw new IllegalArgumentException("overflow!"); 
    i = t; 
} 

public void sub(int j) { 
    int t = i-j; 
    if(t > i) throw new IllegalArgumentException("overflow!"); 
    i = t; 
} 

public void mult(int j) { 
    int mult_max = Integer.MAX_VALUE/i; 
    if(j > mult_max) throw new IllegalArgumentException("overflow!"); 
    i *= j; 
} 
} 
Questions connexes