Есть ли способ объявить int без знака в Java?
Или вопрос может быть сформулирован так: каков Java-эквивалент unsigned?
Просто чтобы рассказать вам контекст, который я смотрел на реализацию Java String.hashcode()
. Я хотел проверить возможность столкновения, если целое число было 32 без знака int.
>>>
вместо оператора оператор>>
.Ответы:
У Java нет типа данных для целых чисел без знака .
Вы можете определить
long
вместо,int
если вам нужно хранить большие значения.Вы также можете использовать целое число со знаком, как если бы оно было без знака. Преимущество представления дополнения к двум состоит в том, что большинство операций (таких как сложение, вычитание, умножение и сдвиг влево) идентичны на двоичном уровне для целых чисел со знаком и без знака. Однако некоторые операции (деление, сдвиг вправо, сравнение и приведение) отличаются. Начиная с Java SE 8, новые методы в
Integer
классе позволяют полностью использоватьint
тип данных для выполнения арифметики без знака :Обратите внимание, что
int
переменные по-прежнему подписаны при объявлении, но теперь возможна арифметика без знака с использованием этих методов вInteger
классе.источник
int
тип данных для представления 32-разрядного целого без знака, которое имеет минимальное значение0
и максимальное значение2^32-1
. - см. docs.oracle.com/javase/tutorial/java/nutsandbolts/… и docs.oracle.com/javase/8/docs/api/java/lang/Integer.htmlint
как если бы они были без знака, используя различные методы.В Java 8 есть API для неподписанного Integer и Long!
источник
Integer
класс в Java 8 позволяет использовать unsigned int, это разница между просто пространством и скоростью (поскольку в C / C ++ они примитивны, а в Java - целая обертка объектов)int
переворачиваются, даже если они подписаны. Это C / C ++, где неподписанный пролонгируется, но подписанный вызывает «неопределенное поведение» при переполнении. Если «переворачивание» является вашей единственной заботой, вам не нужно подписывать. Наверное, поэтому процедуры CRC и т. Д. Работают на Java без лишних усилий. И именно поэтому новый API добавляет только разбор, форматирование, сравнение, деление и остаток. Все остальные операции, а именно все битовые манипуляции, а также сложение, вычитание, умножение и т. Д., В любом случае, делают правильно.То, является ли значение в int знаком или без знака, зависит от того, как интерпретируются биты - Java интерпретирует биты как значение со знаком (у него нет примитивов без знака).
Если у вас есть int, который вы хотите интерпретировать как беззнаковое значение (например, вы читаете int из DataInputStream, который, как вы знаете, содержит беззнаковое значение), то вы можете сделать следующий трюк.
Обратите внимание, что важно, чтобы шестнадцатеричный литерал был длинным литералом, а не целым литералом - следовательно, «l» в конце.
источник
0xFFFFFF
и сохранить инт?Нам нужны неподписанные номера модели MySQL, без знака
TINYINT
,SMALLINT
,INT
,BIGINT
в jOOQ , поэтому мы создали jOOU , минималистичную библиотеку подношение обертки типов для беззнаковых целых чисел в Java. Пример:Все эти типы расширяются
java.lang.Number
и могут быть преобразованы в примитивные типы высшего порядка иBigInteger
. Надеюсь это поможет.(Отказ от ответственности: я работаю на компанию за этими библиотеками)
источник
Для чисел без знака вы можете использовать эти классы из библиотеки Guava :
Они поддерживают различные операции:
В данный момент, похоже, не хватает операторов сдвига байтов. Если вам это нужно, вы можете использовать BigInteger из Java.
источник
Используйте
char
для 16-битных целых чисел без знака.источник
Возможно, это то, что вы имели в виду?
getUnsigned(0)
→ 0getUnsigned(1)
→ 1getUnsigned(Integer.MAX_VALUE)
→ 2147483647getUnsigned(Integer.MIN_VALUE)
→ 2147483648getUnsigned(Integer.MIN_VALUE + 1)
→ 2147483649источник
2 * (long) Integer.MAX_VALUE + 2
это легче понять, чем0x1_0000_0000L
? В связи с этим, почему бы не простоreturn signed & 0xFFFF_FFFFL;
?Кажется, что вы можете справиться с проблемой подписания, выполнив «логическое И» над значениями, прежде чем использовать их:
Пример (значение
byte[]
header[0]
is0x86
):Результат:
источник
Здесь есть хорошие ответы, но я не вижу демонстрации побитовых операций. Как говорит Visser (в настоящее время принятый ответ), Java по умолчанию подписывает целые числа (Java 8 имеет целые числа без знака, но я никогда не использовал их). Без дальнейших церемоний, давайте сделаем это ...
Пример RFC 868
Что произойдет, если вам нужно записать целое число без знака в IO? Практический пример - когда вы хотите вывести время в соответствии с RFC 868 . Для этого требуется 32-разрядное целое число без знака с прямым порядком байтов, которое кодирует количество секунд с 12:00 утра 1 января 1900 года. Как бы вы это закодировали?
Создайте свое собственное 32-разрядное целое число без знака, например:
Объявить байтовый массив из 4 байтов (32 бита)
Это инициализирует массив, см. Являются ли байтовые массивы инициализированными в ноль в Java? , Теперь вам нужно заполнить каждый байт в массиве информацией в порядке с прямым порядком байтов (или с прямым порядком байтов, если вы хотите разрушить хаос). Предполагая, что у вас есть long, содержащий время (длинные целые числа имеют длину 64 бита в Java), который называется
secondsSince1900
(который использует только первые 32 бита, и вы обработали тот факт, что Date ссылается на 12:00 AM 1 января 1970 г.), затем вы можете использовать логическое «И» для извлечения битов из него и смещения этих битов в позиции (цифры), которые не будут игнорироваться при приведении к байту и в порядке с прямым порядком байтов.Наша
my32BitUnsignedInteger
теперь эквивалентна 32-разрядному целому числу с прямым порядком байтов без знака, которое соответствует стандарту RCF 868. Да, длинный тип данных подписан, но мы проигнорировали этот факт, потому что предполагали, что секундаSince1900 использовала только младшие 32 бита). Из-за перевода длинного в байт все биты выше 2 ^ 7 (первые две цифры в шестнадцатеричном формате) будут игнорироваться.Источник ссылки: Java Network Programming, 4-е издание.
источник
Только что сделал этот кусок кода, который конвертирует this.altura из отрицательного числа в положительное. Надеюсь, что это помогает кому-то нуждающемуся
источник
Вы можете использовать функцию Math.abs (число). Возвращает положительное число.
источник
MIN_VALUE
0