JavaRush /Blogue Java /Random-PT /Fundição de tipos primitivos. Convertendo int para short ...
Георгий
Nível 22
Санкт-Петербург

Fundição de tipos primitivos. Convertendo int para short e byte

Publicado no grupo Random-PT
Fundição de tipos primitivos.  Convertendo int para short e byte - 1Por que se você converter alguns valores de tipo intpara type shortou byte, os resultados serão inesperados? Vamos descobrir!
int i = 450;
byte b = (byte)i;
System.out.println(b);
Resultado na tela:

-62
Inesperadamente, há uma explicação lógica para isso, além disso, essa ação pode ser feita com as próprias mãos. Para fazer isso, precisamos converter 450 de decimal para binário:

450/2.    0
225/2.    1
112/2.    0
56/2.     0
28/2.     0
14/2.     0
7/2.      1
3/2.      1
1/2.      1
Na coluna direita do número escrevemos seu resto quando dividido por 2, e sob o próprio número escrevemos o resultado da divisão do nosso número por dois, se o resto for 0. Se o resto for 1, então abaixo escrevemos o parte inteira da divisão por dois. ( Calculadora online com explicação dos cálculos ). Como resultado, obtemos isso no sistema numérico binário 450 = 11100 0010. Qualquer tipo de número intocupa 4 bytes ou 32 bits, onde cada bit é 0 ou 1. No nosso caso, apenas 9 bits são ocupados e, em princípio, o nosso int i = 450em sistema binário fica assim:

0000_0000_0000_0000_0000_0001_1100_0010
Queremos escrever nossa variável em uma variável do tipo byte, mas o número do tipo byteocupa 1 byte (como segue do nome desse tipo) ou 8 bits. Portanto, os bits extras à esquerda são simplesmente descartados e, no final, obtemos:

1100 0010
Faixa de valores de tipo byte: -128 a 127. Cada número ocupa 8 bits e o bit mais à esquerda de cada número é o bit de sinal. Para todos os números positivos é igual a 0, para todos os números negativos é igual a 1. Não há necessidade de pressa para converter nosso resultado obtido acima para o 10º sistema, porque recebemos um código adicional para o número desejado, e não direto. O bit mais à esquerda acabou sendo igual a 1, portanto nosso número é negativo, e para números negativos os códigos direto e reverso não coincidem, ao contrário dos positivos. Se o bit de sinal fosse igual a 0, poderíamos converter imediatamente o número para o sistema numérico decimal e obter: 66. Mas o bit de sinal é negativo, então primeiro precisamos converter o código adicional em um código direto e adicionar um sinal de menos assine para a resposta. Para maior clareza e treinamento, primeiro vamos tentar obter o código adicional de algum número, por exemplo -15. Para fazer isso, no código direto de sua representação positiva (número 15), é necessário alterar todos os 0s para 1s e vice-versa (obter o código reverso, também chamado de inverso), e depois adicionar um ao resultado. No sistema decimal 15 = 0000 1111; Código reverso (altere todos os 0s para 1s e vice-versa) = 1111 0000; Código adicional (adicione um):

1 1 1 1 0 0 0 0
0 0 0 0 0 0 0 1
1 1 1 1 0 0 0 1
Código adicional para o número -15: 1111 0001; Ótimo. Agora, por analogia com o exemplo acima, precisamos converter nosso código adicional em código direto; deixe-me lembrá-lo, é igual a 1100 0010.
  1. Subtraia um e obtenha o código reverso. É conveniente fazer isso, anote um código adicional na resposta e veja o que você precisa adicionar para obter esse código adicional. Começamos com o dígito mais à direita e olhamos: a que precisamos adicionar 1 para obter 0? Para 1, obtemos 10, 0 vai como resposta e 1 vai para o próximo dígito. A seguir, o que precisa ser adicionado a 0 para obter um. Um, mas como temos um do dígito anterior, escrevemos em resposta 0. A seguir, para obter 0, o que devemos adicionar a 0? Claro, 0. Então, mais 4 vezes. E ainda restam os 2 últimos dígitos, onde você precisa somar algo a 0 para obter 1. Claro, em ambos os casos você precisa somar 1. Total:

    
    1 1 0 0 0 0 0 1
    0 0 0 0 0 0 0 1
    1 1 0 0 0 0 1 0
  2. A parte mais difícil já passou! Recebemos o código inverso (reverso) e tudo o que precisamos fazer é obter o direto. Invertemos tudo de 0 em 1 e vice-versa:

    1100 0001- código inverso;

    0011 1110 - o código direto do nosso número, ou melhor, a sua representação positiva;

  3. Converter para o sistema numérico decimal ( calculadora online com explicação dos cálculos ):

    0011 1110 = 0∙2^7+0∙2^6+1∙2^5+1∙2^4+1∙2^3+1∙2^2+1∙2^1+0∙2^0 = 0+0+32+16+8+4+2+0 = 62;

    Resta apenas adicionar um sinal de menos ao número e nossa resposta:-62.

Da mesma forma, os números do tipo são convertidos shortem type int:
int i = 10_000_000;
short s = (short)i;
System.out.println(s); // -27008
  1. 10.000.000 no 10º sistema numérico = 0000 0000 1001 1000 1001 0110 1000 0000no 2º sistema numérico.

    Em Java, um número de tipo intocupa 4 bytes e um shortnúmero de tipo ocupa 2 bytes, ou 16 bits, então cortamos a esquerda para 16 dígitos:

  2. 1001 0110 1000 0000. O bit mais à esquerda (o bit mais significativo, também conhecido como bit de sinal) acabou sendo igual a 1. Isso significa que temos um código adicional para um número negativo, então passamos para o próximo ponto.
  3. Vamos traduzi-lo em código reverso:

    
    1 0 0 1 0 1 1 0 0 1 1 1 1 1 1 1
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1
    1 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0

    Código de retorno: 1001 0110 0111 1111;

  4. Invertemos e obtemos o código direto: 0110 1001 1000 0000.

  5. Convertemos para o sistema numérico binário e obtemos uma representação positiva do nosso número:

    1∙2^14+1∙2^13+1∙2^11+1∙2^8+1∙2^7 = 16384+8192+2048+256+128 = 27008.
  6. Adicione um sinal de menos e obtenha a resposta:-27008

Fundição de tipos primitivos.  Convertendo int para short e byte - 2Link para uma calculadora online de códigos diretos, reversos e complementares. Também neste site, sob a calculadora, há um pouco de teoria sobre o código inverso e complementar.
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION