Czy Java jest zawsze 32-bitowa?

82

Czy Java intzawsze i wszędzie będzie 32-bitową liczbą całkowitą ze znakiem?

nicael
źródło
Liczba bitów użytych do reprezentacji wartości int to stała Integer.SIZE, która jest określana jako public static final int SIZE = 32;od wersji Java 1.5.
burnabyRails

Odpowiedzi:

122

Tak, jest to zdefiniowane w specyfikacji języka Java .

Z punktu 4.2: Typy i wartości pierwotne :

Integralne typy byte, short, int, i long, których wartości są 8-bitowy, 16-bitowy, 32-bitowy i 64-bitową uzupełnienie do dwóch liczb całkowitych, odpowiednio, i char, których wartości są 16-bitowe liczby całkowite bez znaku reprezentujący kod UTF-16 jednostki (§ 3.1).

Oraz dodatkowo z punktu 4.2.1: Typy i wartości całkowe :

Wartości typów całkowitych są liczbami całkowitymi w następujących zakresach:

  • Dla bajtów od -128 do 127 włącznie
  • W skrócie od -32768 do 32767 włącznie
  • Dla int, od -2147483648 do 2147483647 włącznie
  • Długo, od -9223372036854775808 do 9223372036854775807 włącznie
  • W przypadku char, od „\ u0000” do „\ uffff” włącznie, czyli od 0 do 65535
coobird
źródło
8

ints to 32 bity. Jeśli potrzebujesz więcej, longs to 64 bity.

drRoflol
źródło
7

Java 8 dodała obsługę liczb całkowitych bez znaku. Prymityw intjest nadal ze znakiem, jednak niektóre metody będą interpretować je jako bez znaku.

Następujące metody zostały dodane do klasy Integer w Javie 8:

  • porównajUnsigned (int x, int y)
  • divideUnsigned (int dividend, int divisor)
  • parseUnsignedInt (ciągi)
  • parseUnsignedInt (String s, int radix)
  • reszta Unnsigned (int dividend, int divisor)
  • toUnsignedLong (int x)
  • toUnsignedString (int i)
  • toUnsignedString (int i, int radix)

Oto przykład użycia:

public static void main(String[] args) {
    int uint = Integer.parseUnsignedInt("4294967295");
    System.out.println(uint); // -1
    System.out.println(Integer.toUnsignedString(uint)); // 4294967295
}
roblovelock
źródło
4

Dodatkowo, jeśli długość 64 bitów nie spełnia Twoich wymagań, wypróbuj java.math.BigInteger .

Nadaje się do sytuacji, w których liczba jest poza zakresem 64 bitów.

public static void main(String args[]){
    
    String max_long = "9223372036854775807";
    String min_long = "-9223372036854775808";
    
    BigInteger b1 = new BigInteger(max_long);
    BigInteger b2 = new BigInteger(min_long);
    
    BigInteger sum = b1.add(b1);
    BigInteger difference = b2.subtract(b1);
    BigInteger product = b1.multiply(b2);
    BigInteger quotient = b1.divide(b1);
    
    System.out.println("The sum is: " + sum);
    System.out.println("The difference is: " + difference);
    System.out.println("The product is: " + product);
    System.out.println("The quotient is: " + quotient);
    
}

Wynik to:

Suma to: 18446744073709551614

Różnica to: -18446744073709551615

Produkt to: -85070591730234615856620279821087277056

Iloraz to: 1

Eugene
źródło