Signed e unsigned

Oi

Os tipos de dados primitivos em Java, são sempre unsigned (sem sinal)?
Por exemplo, um int tem um intervalo de -2^32-1 a 2^32-1.

Se sim, é possível ter um int com o valor 2^32?

Obrigado

Os tipos byte, short, int, long, float e double são signed, ou seja, possuem um intervalo de valores que vai de um número negativo até um número positivo. O tipo char é o único tipo unsigned do Java, tendo 16 bits, e um intervalo de valores entre 0 e 65535.

P.S.: O tipo boolean é dependente da implementação específica da JVM.

2 ^ 32 tem 33 bits em representação binária. (é 1 seguido de 32 zeros). Portanto não pode ser representado nem em um “signed” int do Java, nem em um “unsigned” int do C++, que têm apenas 32 bits.

2 ^32 requer um “long” do Java (64 bits).

Uma coisa que sempre me atrapalha a vida é que o “byte” do Java é “signed” , não “unsigned”. Isso acaba tendo de forçar este tipo de código (que pode ser visto até no JDK:)

/** Lê 1 byte */
int read () {
    int ret = alguma coisa que retorna 1 byte;
    return ret & 0xFF; // isto mantém apenas os 8 bits do byte
}