Являются ли целочисленные примитивные типы в Java знаковыми?

«Являются ли целочисленные примитивные типы в Java знаковыми?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, все целочисленные примитивные типы в Java (byte, short, int, long) являются знаковыми (signed). Они используют старший бит для знака и могут представлять как положительные, так и отрицательные числа.

Диапазоны знаковых типов:

  • byte: от -128 до 127
  • short: от -32 768 до 32 767
  • int: от -2³¹ до 2³¹-1
  • long: от -2⁶³ до 2⁶³-1

Работа с беззнаковой (unsigned) интерпретацией: Начиная с Java 8, в классах-обертках (Integer, Long) появились статические методы для обработки значений в беззнаковом контексте.

// Знаковое хранение
int signed = -42;
System.out.println(signed); // -42

// Беззнаковая интерпретация при выводе
String unsignedString = Integer.toUnsignedString(signed);
System.out.println(unsignedString); // "4294967254" (для 32-битного int)

// Парсинг беззнаковой строки
int parsedUnsigned = Integer.parseUnsignedInt("4294967254");
System.out.println(parsedUnsigned); // -42 (хранится как знаковое, но интерпретировалось как беззнаковое)

// Сравнение в беззнаковом контексте
int a = -1;
int b = 1;
boolean unsignedCompare = Integer.compareUnsigned(a, b) > 0; // true, т.к. -1 как беззнаковое = 4 294 967 295

Важно: Сам тип int остаётся знаковым. Эти методы лишь меняют способ его интерпретации при выполнении конкретных операций.