← Назад к вопросам

Что такое беззнаковые числа?

1.0 Junior🔥 61 комментариев
#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Беззнаковые числа (Unsigned Integer)

Беззнаковые числа — это целые числа, которые могут представлять только неотрицательные значения (0 и положительные). В отличие от знаковых чисел, они не используют один бит для хранения знака, что позволяет представлять большие положительные значения.

Основное различие между знаковыми и беззнаковыми числами

Знаковые (Signed):

  • Один бит отводится под знак
  • Могут быть положительными и отрицательными
  • Диапазон: от -2^(n-1) до 2^(n-1) - 1

Беззнаковые (Unsigned):

  • Все биты используются для значения
  • Только неотрицательные значения
  • Диапазон: от 0 до 2^n - 1

Сравнение типов данных

ТипРазмерДиапазон знаковыйДиапазон беззнаковый
byte1 byte-128 до 1270 до 255
short2 bytes-32,768 до 32,7670 до 65,535
int4 bytes-2,147,483,648 до 2,147,483,6470 до 4,294,967,295
long8 bytes-9,223,372,036,854,775,808 до 9,223,372,036,854,775,8070 до 18,446,744,073,709,551,615

Java и беззнаковые числа

Java не имеет встроенных примитивных типов для беззнаковых целых чисел (кроме char). Это было сделано в целях упрощения языка. Однако Java предоставляет методы для работы с беззнаковыми числами:

// Java использует знаковые типы, но предоставляет утилиты
public class UnsignedIntegerExample {
    public static void main(String[] args) {
        // Знаковый int
        int signedValue = -1;
        
        // Преобразование в беззнаковое представление
        long unsignedValue = Integer.toUnsignedLong(signedValue);
        System.out.println("Signed: " + signedValue);
        System.out.println("Unsigned: " + unsignedValue); // 4294967295
    }
}

Битовое представление

Знаковое число (8-бит):

-1 = 11111111 (в дополнительном коде)
-2 = 11111110
0  = 00000000
1  = 00000001
127 = 01111111
-128 = 10000000

Беззнаковое число (8-бит):

0   = 00000000
1   = 00000001
255 = 11111111

Работа с беззнаковыми числами в Java

Преобразование знакового в беззнаковое:

public class UnsignedConversion {
    public static void main(String[] args) {
        // byte (знаковый): -128 до 127
        byte signedByte = -50;
        
        // Преобразование в беззнаковое представление
        int unsignedInt = signedByte & 0xFF;
        System.out.println("Signed byte: " + signedByte);      // -50
        System.out.println("Unsigned value: " + unsignedInt);  // 206
    }
}

Методы Integer класса для беззнаковых операций:

public class UnsignedOperations {
    public static void main(String[] args) {
        int signedValue = -1;
        
        // Преобразование в беззнаковое
        long unsignedLong = Integer.toUnsignedLong(signedValue);
        System.out.println("toUnsignedLong: " + unsignedLong);
        
        // Беззнаковое деление
        int dividend = -4;
        int divisor = 2;
        int result = Integer.divideUnsigned(dividend, divisor);
        System.out.println("Unsigned division: " + result);
        
        // Беззнаковый остаток
        int remainder = Integer.remainderUnsigned(dividend, divisor);
        System.out.println("Unsigned remainder: " + remainder);
        
        // Беззнаковое сравнение
        int compare = Integer.compareUnsigned(-1, 1);
        System.out.println("Compare unsigned: " + compare); // 1 (-1 > 1 в беззнаковом)
    }
}

char — беззнаковый тип в Java

Java имеет один встроенный беззнаковый примитивный тип — char:

public class CharUnsigned {
    public static void main(String[] args) {
        // char — 16-бит беззнаковое число (0 - 65535)
        char ch = 65; // Буква A
        System.out.println(ch); // A
        
        char maxChar = Character.MAX_VALUE; // 65535
        System.out.println("Max char: " + (int) maxChar);
        
        // Хранение Unicode символов
        char unicode = α; // Греческая буква альфа
        System.out.println(unicode); // α
    }
}

Практические примеры использования

Работа с IP адресами:

public class IPAddressHandler {
    public static void main(String[] args) {
        // IP адрес 192.168.1.1 в 32-бит число
        long ipAddress = (192L << 24) | (168L << 16) | (1L << 8) | 1L;
        System.out.println("IP as long: " + ipAddress);
        
        // Извлечение октетов
        byte octet1 = (byte) ((ipAddress >> 24) & 0xFF);
        byte octet2 = (byte) ((ipAddress >> 16) & 0xFF);
        byte octet3 = (byte) ((ipAddress >> 8) & 0xFF);
        byte octet4 = (byte) (ipAddress & 0xFF);
        
        System.out.println(octet1 + "." + (octet2 & 0xFF) + "." + 
                          (octet3 & 0xFF) + "." + (octet4 & 0xFF));
    }
}

Работа с сетевыми портами:

public class PortHandler {
    public static void main(String[] args) {
        // Диапазон портов: 0-65535 (беззнаковые 16-бит)
        int port = 8080;
        
        // Проверка валидности порта
        if (port >= 0 && port <= 65535) {
            System.out.println("Valid port");
        }
        
        // Работа с портами как с беззнаковыми
        int minPort = 0;
        int maxPort = 65535;
        System.out.println("Port range: " + minPort + " - " + maxPort);
    }
}

Работа с цветами (RGBA):

public class ColorHandler {
    public static void main(String[] args) {
        // Цвет RGBA (каждый компонент 0-255)
        int red = 255;
        int green = 128;
        int blue = 64;
        int alpha = 255;
        
        // Объединение в одно 32-бит число
        int color = (alpha << 24) | (red << 16) | (green << 8) | blue;
        System.out.println("Color RGBA: " + Integer.toHexString(color));
        
        // Извлечение компонентов
        int extractedRed = (color >> 16) & 0xFF;
        int extractedGreen = (color >> 8) & 0xFF;
        int extractedBlue = color & 0xFF;
        
        System.out.println("R:" + extractedRed + " G:" + extractedGreen + 
                          " B:" + extractedBlue);
    }
}

Когда использовать беззнаковые числа

  • Сетевые протоколы: IP адреса, порты
  • Работа с памятью: размеры, адреса
  • Графика: цвета (RGB, RGBA)
  • Битовые операции: флаги, битовые маски
  • Криптография: хеши

Преимущества и недостатки

Преимущества:

  • Удвоенный диапазон положительных значений
  • Полезны для битовых операций
  • Эффективны для работы с физическими адресами

Недостатки:

  • Нет встроенной поддержки в Java
  • Требуют дополнительных преобразований
  • Могут привести к ошибкам, если забыть о диапазонах

Заключение

Беззнаковые числа — это числовые типы данных, которые представляют только неотрицательные значения. Хотя Java не имеет встроенных примитивных беззнаковых типов, она предоставляет утилиты для работы с ними. Понимание беззнаковых чисел критично для работы с сетевыми протоколами, графикой и битовыми операциями.

Что такое беззнаковые числа? | PrepBro