Em Java, é possível embalar um número inteiro que se espera que não seja negativo e seja final (não transbordante) em um curto?
Pergunta
"Int não assinado" em uma curta e volta. Isso é possível? Como fazer isso se sim?
Grrrr. Esqueci como os números assinados são implementados. A pergunta não faz sentido. Obrigado de qualquer maneira. Eu estava indo para me voar, você pode fazê -lo.
Solução
Não tenho certeza se entendi completamente a pergunta, mas se você tem certeza de que você está se encaixando em um curto (seu número está entre 0 e 2^16), você sempre pode lançar seu INT para um curto:
int i = 65536;
short s = (short) i;
E para obter o valor não assinado de volta: int i2 = s & 0xffff; System.out.println (i2);
o s & 0xFFFF
O upcast s para uma máscara de bits "converterá" o número negativo em seu valor não assinado (mais ou menos). Lembre -se de que FFFF em uma variável curta -1 e não 65536.
Outras dicas
Parece que você está esperando um tipo básico que fará o trabalho para você, mas acho que não existe. Por outro lado, não imagino que seria muito difícil criar um objeto que faça o trabalho. Ajuste conforme necessário para torná -lo curto.
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; } }
Se o seu número inteiro não tiver nenhuma característica específica, como ser um múltiplo de algo, acho que não pode.
O problema é que as informações contidas em um INT, que geralmente são de 32 bits, a arquitetura não pode ser contida em um curto.
Como você pode ver de Short.MAX_VALUE
O valor máximo é 2^15 - 1, já que um curto ocupa 16 bits .. então você realmente perde precisão e não pode expressar números inteiros como 2²² ..
Se você deseja tipos não assinados, você pode usar o Javolução biblioteca.