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?

StackOverflow https://stackoverflow.com/questions/2520757

  •  22-09-2019
  •  | 
  •  

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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top