int
para type short
ou 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 int
ocupa 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 = 450
em 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 byte
ocupa 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
.
-
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
-
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; -
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.
short
em type int
:
int i = 10_000_000;
short s = (short)i;
System.out.println(s); // -27008
-
10.000.000 no 10º sistema numérico =
0000 0000 1001 1000 1001 0110 1000 0000
no 2º sistema numérico.Em Java, um número de tipo
int
ocupa 4 bytes e umshort
número de tipo ocupa 2 bytes, ou 16 bits, então cortamos a esquerda para 16 dígitos: -
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
; -
Invertemos e obtemos o código direto:
0110 1001 1000 0000
. -
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.
-
Adicione um sinal de menos e obtenha a resposta:
-27008
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.
GO TO FULL VERSION