Como Verificar se um Inteiro Está Dentro do Intervalo Short em Java

JavaBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá como verificar se um valor inteiro se enquadra no intervalo do tipo de dado short em Java. Começaremos entendendo o intervalo definido para short (-32768 a 32767) e, em seguida, prosseguiremos para verificar valores inteiros em relação a esses limites. Finalmente, exploraremos como lidar com valores de limite (boundary values) de forma eficaz.

Definir Intervalo Short (-32768 a 32767)

Nesta etapa, exploraremos o tipo de dado short em Java e entenderemos seu intervalo. Em programação, os tipos de dados são usados para classificar diferentes tipos de dados que uma variável pode conter. O tipo de dado short é um inteiro de complemento de dois com sinal de 16 bits. Isso significa que ele pode armazenar números inteiros, tanto positivos quanto negativos, dentro de um intervalo específico.

O intervalo de um short em Java é de -32.768 a 32.767. Entender esses limites é crucial para evitar erros como overflow (estouro) ou underflow (subfluxo), que ocorrem quando você tenta armazenar um valor fora do intervalo do tipo de dado.

Vamos criar um programa Java simples para ver o tipo de dado short em ação e observar seus limites.

  1. Abra o arquivo HelloJava.java no editor WebIDE, caso ele ainda não esteja aberto.

  2. Substitua todo o conteúdo do arquivo pelo seguinte código:

    public class HelloJava {
        public static void main(String[] args) {
            // Declare and initialize a short variable
            short myShort = 10000;
            System.out.println("My short variable: " + myShort);
    
            // Demonstrate the maximum value of short
            short maxShort = 32767;
            System.out.println("Maximum short value: " + maxShort);
    
            // Demonstrate the minimum value of short
            short minShort = -32768;
            System.out.println("Minimum short value: " + minShort);
        }
    }

    Neste código:

    • Declaramos uma variável myShort do tipo short e atribuímos a ela o valor 10000.
    • Em seguida, declaramos maxShort e minShort e atribuímos a elas os valores máximo e mínimo que um short pode conter.
    • Usamos System.out.println() para imprimir os valores dessas variáveis no console.
  3. Salve o arquivo (Ctrl+S ou Cmd+S).

  4. Agora, vamos compilar nosso programa. Abra o Terminal na parte inferior do WebIDE e certifique-se de estar no diretório ~/project. Caso contrário, use o comando cd ~/project. Em seguida, compile o código usando o comando javac:

    javac HelloJava.java

    Se não houver erros, a compilação será bem-sucedida e um arquivo HelloJava.class será criado no diretório ~/project.

  5. Finalmente, execute o programa compilado usando o comando java:

    java HelloJava

    Você deve ver a seguinte saída no Terminal:

    My short variable: 10000
    Maximum short value: 32767
    Minimum short value: -32768

    Esta saída confirma que nossas variáveis short estão armazenando os valores esperados dentro do intervalo definido. Na próxima etapa, exploraremos o que acontece quando tentamos atribuir valores fora desse intervalo.

Verificar Inteiro em Relação aos Limites Short

Na etapa anterior, vimos como declarar e usar variáveis short dentro de seu intervalo válido. Agora, vamos explorar o que acontece quando tentamos atribuir um valor que está fora do intervalo de short a uma variável short.

Java possui diferentes tipos de dados inteiros, incluindo byte, short, int e long, cada um com um intervalo diferente. Um int (inteiro) é um inteiro de complemento de dois com sinal de 32 bits, com um intervalo de -2.147.483.648 a 2.147.483.647. Este intervalo é muito maior do que o de um short.

Quando você tenta atribuir um valor de um tipo de dado maior (como int) a um tipo de dado menor (como short), o Java exige que você diga explicitamente que está ciente da possível perda de informações. Isso é chamado de type casting (conversão de tipo). Se você não fizer a conversão, o Java fornecerá um erro de compilação para evitar a perda acidental de dados.

Vamos modificar nosso programa HelloJava.java para demonstrar isso.

  1. Abra o arquivo HelloJava.java no editor WebIDE.

  2. Substitua o código existente pelo seguinte:

    public class HelloJava {
        public static void main(String[] args) {
            int largeInt = 40000; // This value is outside the short range
    
            // Attempt to assign largeInt to a short variable without casting
            // short myShort = largeInt; // This line will cause a compilation error
    
            // To assign a value from a larger type, we need to cast it
            short myShort = (short) largeInt;
            System.out.println("Value of largeInt cast to short: " + myShort);
    
            int anotherLargeInt = -40000; // Another value outside the short range
            short anotherShort = (short) anotherLargeInt;
            System.out.println("Value of anotherLargeInt cast to short: " + anotherShort);
        }
    }

    Neste código atualizado:

    • Declaramos uma variável int largeInt com o valor 40000, que é maior que o valor máximo que um short pode conter (32767).
    • A linha comentada short myShort = largeInt; mostra o que aconteceria sem a conversão – um erro de compilação.
    • A linha short myShort = (short) largeInt; demonstra como converter o valor int para um short. O (short) antes de largeInt é o operador de conversão.
    • Fazemos o mesmo para um valor negativo anotherLargeInt (-40000), que é menor que o valor mínimo que um short pode conter (-32768).
  3. Salve o arquivo (Ctrl+S ou Cmd+S).

  4. Agora, compile o programa modificado no Terminal:

    javac HelloJava.java

    Desta vez, a compilação deve ser bem-sucedida porque usamos a conversão de tipo.

  5. Execute o programa compilado:

    java HelloJava

    Você verá uma saída semelhante a esta:

    Value of largeInt cast to short: -25536
    Value of anotherLargeInt cast to short: 25536

    Observe que os valores de saída (-25536 e 25536) não são os valores originais (40000 e -40000). Isso ocorre porque, quando você converte um valor que está fora do intervalo do tipo de dado de destino, o valor "envolve" (wraps around). Este é um exemplo de overflow (para valores positivos que excedem o máximo) e underflow (para valores negativos que excedem o mínimo). O valor resultante exato depende de como os números são representados em binário. Isso demonstra por que entender os intervalos de tipos de dados e usar a conversão com cuidado é importante para evitar resultados inesperados.

Lidar com Valores de Limite

Nas etapas anteriores, aprendemos sobre o intervalo do tipo de dado short e vimos o que acontece quando convertemos valores inteiros maiores que estão fora desse intervalo. Também é importante entender como o Java lida com valores exatamente nos limites do intervalo short (-32768 e 32767).

Ao trabalhar com valores nos limites, você precisa ter cuidado, especialmente ao realizar operações aritméticas. Adicionar 1 ao valor máximo ou subtrair 1 do valor mínimo pode levar a overflow (estouro) ou underflow (subfluxo), fazendo com que o valor se envolva para a outra extremidade do intervalo.

Vamos modificar nosso programa HelloJava.java mais uma vez para demonstrar esse comportamento limite.

  1. Abra o arquivo HelloJava.java no editor WebIDE.

  2. Substitua o código existente pelo seguinte:

    public class HelloJava {
        public static void main(String[] args) {
            short maxShort = 32767;
            System.out.println("Maximum short value: " + maxShort);
    
            // Adding 1 to the maximum short value
            // Note: The result of maxShort + 1 is an int by default
            int overflowInt = maxShort + 1;
            System.out.println("Maximum short + 1 (as int): " + overflowInt);
    
            // Casting the overflowed int back to short
            short overflowShort = (short) overflowInt;
            System.out.println("Maximum short + 1 (cast to short): " + overflowShort);
    
            short minShort = -32768;
            System.out.println("Minimum short value: " + minShort);
    
            // Subtracting 1 from the minimum short value
            // Note: The result of minShort - 1 is an int by default
            int underflowInt = minShort - 1;
            System.out.println("Minimum short - 1 (as int): " + underflowInt);
    
            // Casting the underflowed int back to short
            short underflowShort = (short) underflowInt;
            System.out.println("Minimum short - 1 (cast to short): " + underflowShort);
        }
    }

    Neste código:

    • Começamos com o valor short máximo (maxShort).
    • Adicionamos 1 a maxShort. Por padrão, as operações aritméticas envolvendo short (e byte) são promovidas para int. Portanto, maxShort + 1 resulta em um int. Armazenamos isso em overflowInt.
    • Em seguida, convertemos overflowInt de volta para um short e o armazenamos em overflowShort. É aqui que o estouro acontece e o valor se envolve.
    • Fazemos operações semelhantes com o valor short mínimo (minShort), subtraindo 1 para demonstrar o subfluxo.
  3. Salve o arquivo (Ctrl+S ou Cmd+S).

  4. Compile o programa no Terminal:

    javac HelloJava.java
  5. Execute o programa compilado:

    java HelloJava

    Você deve ver uma saída semelhante a esta:

    Maximum short value: 32767
    Maximum short + 1 (as int): 32768
    Maximum short + 1 (cast to short): -32768
    Minimum short value: -32768
    Minimum short - 1 (as int): -32769
    Minimum short - 1 (cast to short): 32767

    Como você pode ver, quando adicionamos 1 ao valor short máximo (32767) e o convertemos de volta para short, ele se envolve para o valor mínimo (-32768). Da mesma forma, subtrair 1 do valor short mínimo (-32768) e converter de volta para short se envolve para o valor máximo (32767).

    Este comportamento é importante lembrar ao trabalhar com tipos inteiros de tamanho fixo como short. Esteja sempre atento ao intervalo do tipo de dado para evitar resultados inesperados devido a estouro ou subfluxo.

Resumo

Neste laboratório, aprendemos sobre o tipo de dado short em Java, entendendo sua natureza de complemento de dois com sinal de 16 bits e seu intervalo específico de -32.768 a 32.767. Exploramos como declarar e inicializar variáveis short e demonstramos os valores máximo e mínimo que ele pode conter por meio de um programa Java simples. Esta etapa fundamental é crucial para evitar potenciais erros de overflow (estouro) ou underflow (subfluxo) ao trabalhar com valores inteiros dentro desse intervalo.