Задача
На входе имеем байт (типа byte), хранящий некоторое беззнаковое целое. Нужно привести его к типу int.
Решение
Как известно, в Java нет unsinged-типов, т.е. сам по себе byte трактуется как знаковое целое. Нам же нужно, чтобы байт был истрактован как беззнаковое целое, т.е. чтобы его старший разряд имел вес 128 вместо -128 (для представления отрицательных чисел в Java используется дополнительный код). Чтобы преобразовать беззнаковый байт в int, нужно сделать следующее:
int num = (int) bite & 0xFF
Побитовый "&" нужен вот зачем: при обычном касте байта к int произойдет расширение знакового разряда, т.е., например, если на входе был байт 1000 0000 (двоичное представление беззнакового числа "128"), после приведения к 4-ехбайтовому int получим:
1111 1111 1111 1111 1111 1111 1000 0000, что является двоичным представлением знакового целого "-128", тогда как нам нужно:
0000 0000 0000 0000 0000 0000 1000 0000, т.е. знавое целое "128".
Это самое "расширение" знакового разряда и исправляется побитовым "И" с числом 0xFF:
1111 1111 1111 1111 1111 1111 1000 0000
&
0000 0000 0000 0000 0000 0000 1111 1111
=
0000 0000 0000 0000 0000 0000 1000 0000
Комментариев нет:
Отправить комментарий