Java for Beginner
676 subscribers
560 photos
156 videos
12 files
858 links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Полный разбор примитивного типа int в Java

Тип int — это один из восьми примитивных типов данных в Java. Несмотря на его кажущуюся простоту, понимание того, как он устроен, работает в памяти и взаимодействует с JVM, критически важно для глубокого освоения языка.


Общая информация


Тип: примитивный (primitive)
Размер: 32 бита (4 байта)
Диапазон значений: от -2,147,483,648 до 2,147,483,647 (т.е. от -2³¹ до 2³¹ - 1)
Знаковый: да (signed)
Формат представления: two's complement (двойное дополнение)


Пример объявления переменной:
int number = 42;



Что значит signed (знаковый тип)?


В типе int один из битов используется для хранения знака числа:
0 — положительное число
1 — отрицательное число


Это позволяет хранить как положительные, так и отрицательные значения. Всего 2³² возможных комбинаций битов. Из них:
половина — для отрицательных чисел
половина — для положительных чисел (включая 0)



Представление чисел: формат two’s complement

Java использует формат двойного дополнения (two’s complement) для хранения отрицательных чисел. Это универсальный и эффективный способ хранения знаковых чисел в бинарной форме.

Как это работает:


Чтобы получить -x:
Возьми двоичное представление x.
Инвертируй все биты (обратное дополнение).
Прибавь 1.


Пример: -5

5 = 00000000 00000000 00000000 00000101
Инверсия = 11111111 11111111 11111111 11111010
+1 → 11111111 11111111 11111111 11111011
Так хранится -5 в памяти.



Где хранится int в памяти?

В стеке (stack)
Если переменная int — локальная переменная метода, она хранится в стековой рамке метода.

В куче (heap)
Если int является полем объекта (int age внутри класса), то он хранится в куче, как часть объекта.


Что такое стековая рамка (stack frame)?

Каждый вызов метода в Java создаёт отдельную область в стеке, называемую stack frame. Она содержит:
Локальные переменные
Временные значения
Адрес возврата
Операнды

Когда метод завершается — стековая рамка удаляется, а память освобождается.



Как происходит запись и удаление int?

Запись: JVM резервирует 4 байта и записывает число в двоичном формате.
Удаление: локальные переменные исчезают при завершении метода. Если
int был частью объекта, он удаляется при сборке мусора (GC), когда объект становится недостижимым.


Особенности

1. Переполнение (overflow)

int не выбрасывает исключений при выходе за границы диапазона:
int a = Integer.MAX_VALUE; // 2_147_483_647
a++;
System.out.println(a); // -2_147_483_648 (переполнение)
Чтобы отлавливать такие случаи, используйте Math.addExact(), которая кидает ArithmeticException.


Если продолжить увеличивать значение переменной типа
int после переполнения, то поведение будет цикличным. То есть от 2_147_483_647 до -2_147_483_648 не выходя за пределы этих значений.

2. Побитовые операции


Java поддерживает прямые операции над битами:
& — побитовое И
| — побитовое ИЛИ
^ — XOR
~ — побитовое НЕ
<< — сдвиг влево
>> — сдвиг вправо (с сохранением знака)
>>> — сдвиг вправо (без сохранения знака)


Пример:
int x = 5;    // 00000101
int y = 3; // 00000011

int result = x & y; // 00000001 (1)


3. Автоупаковка и Integer-кэш

При автоупаковке int → Integer:
Integer a = 100;
Integer b = 100;
System.out.println(a == b); // true


Но:
Integer a = 1000;
Integer b = 1000;
System.out.println(a == b); // false


Почему?
Значения от -128 до 127 кэшируются.
JVM использует один и тот же объект для этих чисел (ради оптимизации).
Сравнение == проверяет ссылку, а не значение.
Для сравнения значений используйте .equals().



Преобразования типов

int неявно (автоматически) расширяется до long, float, double.

Сужающее преобразование требует явного приведения:
byte b = (byte) 130; // b == -126


#Java #для_новичков #beginner #int