Сижу я значит, разбираюсь в коде алгоритма Base64, пытаясь понять что за магические манипуляции с битами происходят. Замечаю очень странный момент: Прежде, чем выполнять какие-либо операции, типа сдвигов и всего такого, все байты кастуются в Int. Черт возьми! Что за фигня еще??? Они только что превратили 8 бит в 32.
Почему Java использует int вместо byte или short.
Для начала разберемся как адресуется память в процессоре. ЦПУ основаны на регистрах и шинах. Регистр - это блок ячеек памяти, занимающий соответственно 32 или 64 бита. Ячейки памяти в свою очередь занимают количество бит, кратное степени двойки от 8 до 64. Не так просто, как говорят на уроках информатики о списке нулей и единиц.
Изначально Java была спроектирована для работы на 32 битных процессорах, следовательно, любая ячейка памяти будет занимать ровно 4 байта, прямо как количество памяти отведенное на int.
byte
и short
будут занимать ровно то же пространство, что и int
, если это:
- Локальная переменная (Объявленная в методе или конструкторе)
- Переменная класса (Статическая переменная)
- Переменная экземпляра (Объявленная в классе, но за пределами методов или конструктора)
Почему? Потому что в большинстве компьютерных систем адреса переменных выровнены. Например, если вы используете 1 байт, по факту будете получать 4 в памяти. Первый справа, тот самый и 3 для отступа.
А что если я положу ее в массив?
Тут, byte будет занимать точно 1 байт, а short 2 байта. Потому что в массивах дает нам ссылку на конкретный участок в памяти, имеющий начало и конец, которые будут выровнены.