какое максимальное целое число без знака можно сохранить в 32 битах java
Беззнаковая арифметика в Java
Преобразование byte в short (int, long)
Обычный каст (int) myByte выполнит расширение до 32 бит со знаком — это означает, что если старший бит байта был установлен в 1, то результатом будет то же самое отрицательное число, но записанное в 32-битном формате:
Сравнение без учёта знака
Для беззнакового сравнения есть лаконичная формула:
Сложение, вычитание и умножение
А вот здесь приятный сюрприз — эти операции выполняются корректно в любом случае. Но в выражениях необходимо тщательно следить за тем, чтобы операции выполнялись с числами одного типа, так как любые неявные преобразования выполняются с расширением знака, и могут приводить к результатам, отличным от ожидаемых. Коварство таких багов в том, что ошибочный сценарий может выполняться очень редко.
Деление
Чтобы код компилировался, придётся также позаимствовать реализацию compare(long, long) :
и Longs.compare(long, long) + flip(long) :
Побитовые сдвиги
The shift arithmetic left (SAL) and shift logical left (SHL) instructions perform the same operation; they shift the bits in the destination operand to the left (toward more significant bit locations). For each shift count, the most significant bit of the destination operand is shifted into the CF flag, and the least significant bit is cleared (see Figure 7-7 in the Intel®64 and IA-32 Architectures Software Developer’sManual, Volume 1).
То есть SAL добавили просто для симметрии, с учётом того, что для сдвига вправо есть разделение на логический и арифметический. Ну а Гослинг решил не заморачиваться (и, думается, правильно сделал).
Объявление беззнакового int в Java
Есть ли способ объявить беззнаковое int в Java?
Или вопрос может быть сформулирован так: что такое эквивалент unsigned в Java?
11 ответов
В Java нет типа данных для целых чисел без знака.
Вы также можете использовать целое число со знаком, как если бы оно было беззнаковым. Преимущество представления дополнения до двух заключается в том, что большинство операций (таких как сложение, вычитание, умножение, и сдвиг влево) идентичны на двоичном уровне для целых чисел со знаком и без знака. Однако некоторые операции (деление, сдвиг вправо, сравнение и приведение) отличаются. Начиная с Java SE 8, новые методы в Integer позволяет полностью использовать тип данных int для выполнения беззнаковой арифметики:
Вы можете использовать функцию Math.abs (number). Возвращает положительное число.
Только что создал этот фрагмент кода, который преобразует this.altura из отрицательного числа в положительное. Надеюсь, это поможет кому-то в нужде
Кажется, что вы можете решить проблему подписи, выполнив «логическое И» над значениями перед их использованием:
Пример (значение byte[] header[0] равно 0x86 ):
Может это ты имел ввиду?
RFC 868 Пример
Что произойдет, если вам нужно записать целое число без знака в IO? Практический пример: вы хотите вывести время в соответствии с RFC 868. Для этого требуется 32-битное целое число без знака с прямым порядком байтов, которое кодирует количество секунд, прошедших с 12:00 A.M. 1 января 1900 года. Как бы вы это закодировали?
Создайте собственное 32-битное целое число без знака следующим образом:
Объявить байтовый массив из 4 байтов (32 бита)
Наш my32BitUnsignedInteger теперь эквивалентен беззнаковому 32-битному целому числу с прямым порядком байтов, которое соответствует стандарту RCF 868. Да, длинный тип данных подписан, но мы проигнорировали этот факт, потому что мы предположили, что secondsSince1900 использует только младшие 32 бита). Из-за преобразования long в байт все биты выше 2 ^ 7 (первые две цифры в шестнадцатеричном формате) будут проигнорированы.
Ссылка на источник: Сетевое программирование Java, 4-е издание.
Используйте char для 16-битных целых чисел без знака.
unsigned short в java
Как я могу объявить unsigned short значение в Java?
14 ответов
Если вам действительно нужно значение с ровно 16 битами:
решение 2 (где Решение 1 не применяется): используйте нижние 16 бит int и удалите более высокие биты с & 0xffff, где необходимый.
Это действительно устаревшая нить, но для тех, кто придет после. Char является числовым типом. Он поддерживает все математические операторы, битовые операции и т. д. Это беззнаковый 16.
вы можете использовать char, так как это беззнаковое 16-битное значение (хотя технически это символ unicode, поэтому в будущем может измениться на 24-битное значение). другой альтернативой является использование int и убедитесь, что он находится в пределах диапазона.
нет такого типа в java
Да нет такой вещи, если вы хотите использовать значение в коде против битовых операций.
нет, на самом деле такого метода нет, java-язык высокого уровня. Вот почему в Java нет беззнаковых типов данных.
Он сказал, что хочет создать многомерный короткое время. Но никто не предложил побитовые операторы? Из того, что я читал, вы хотите использовать 16-битные целые числа над 32-битными целыми числами для сохранения памяти?
так, во-первых, для начала 10 000 х 10 000 коротких значений 1,600,000,000 бит, 200 000 000 байт, 200 000 килобайт, мегабайт 200.
Если вам нужно что-то с 200 МБ потребления памяти, вы можете изменить эту идею. Я также не верю, что даже скомпилирую let один беги. Вы никогда не должны инициализировать большие массивы, если что-то использует 2 функции, называемые загрузкой по требованию и кэшированием данных. По сути, загрузка по требованию относится к идее загружать только данные по мере необходимости. Затем кэширование данных делает то же самое, но использует пользовательский фрейм для удаления старой памяти и добавления новой информации по мере необходимости. Это сложно, чтобы иметь хорошую производительность скорости. Есть и другие вещи, которые вы можете сделать, но эти два мои любимые, когда закончите право.
Хорошо, вернемся к тому, что я говорил о побитовых операторах.
Итак, 32-битное целое число или в Java «int». Вы можете хранить так называемые «биты», поэтому предположим, что у Вас было 32 булевых значения, которые в Java все значения занимают 32 бита (кроме длинных) или для массивов они занимают 8 для байта, 16 для короткого и 32 для int. Поэтому, если у вас нет массивов, вы не получаете никаких преимуществ памяти от использования байта или короткого. Это не означает, что вы не должны использовать его как способ обеспечения вы и другие знаете диапазон данных, который должно иметь это значение.
теперь, как я говорил, Вы можете эффективно хранить 32 логических значения в одно целое число, выполнив следующее:
Итак, теперь короткий состоит из 16 бит, поэтому 16 + 16 = 32, который идеально вписывается в 32-битное целое число. Таким образом, каждое значение int может состоять из 2 коротких значений.
допустим, мы хотим получить два 16-битных целочисленных значений.
также в основном думают о побитовых операторах как о степенях 2. Это все, чем они являются на самом деле. Никогда не смотрите на это с точки зрения 0 и 1. Я в основном разместил это, чтобы помочь всем, кто может столкнуться с этим поиском неподписанных коротких или даже, возможно, многомерных массивов. Если есть какие-либо опечатки, я прошу прощения, быстро написал это.
Если использование сторонней библиотеки является опцией, есть jOOU (библиотека спина от jOOQ), который предлагает типы оболочки для целых чисел без знака в Java. Это не совсем то же самое, что поддержка примитивного типа (и, следовательно, байтового кода) для неподписанных типов, но, возможно, это все еще достаточно хорошо для вашего варианта использования.
(отказ от ответственности: я работаю в компании за этими библиотеками)
Максимальный размер INT для 32-битной системы
Предположим, мы говорим о 32-битной системе.
Значит ли это, что у меня есть только 31 бит для значения и 1 бит для знака? Или я могу использовать целые 32 бита для хранения значения?
Вы используете все 32 бита. Просто функции вывода по умолчанию интерпретируют его как целое число со знаком. Если вы хотите отобразить значение «raw», используйте:
Поскольку PHP обрабатывает целые числа, подписанные внутри, однако, вы можете использовать только битовую арифметику, но не добавление / умножение и т. Д., Если вы ожидаете, что они будут вести себя как беззнаковые int.
Насколько я знаю, в 32-битной системе наибольшее положительное целое число – это значения 2147483647 выше, будут значения float, так как значение float в php может принимать значения до 10000000000000.
Во-вторых, официальная реализация php использует внутреннее дополнение Two для представления чисел, как и практически всех других компиляторов и интерпретаторов. Поскольку энтропия знакового бита (если вы считаете 0 положительным [1] ) равна 1, а энтропия 31 бита – ну, 31, вы можете сохранить 2 32 = 4 294 967 296 различных значений. Как вы их интерпретируете, зависит ваше приложение.
[1] – 0 не является ни положительным, ни отрицательным.
Обычно с 32-битными целыми значениями разница между подписанным и unsigned – это то, как вы интерпретируете значение. Например, (-1) +1 будет равным 1 для подписанных и неподписанных, для подписанных это очевидно, и для unsigned это, конечно, только true, если вы просто перебиваете переполнение. Таким образом, у вас есть 32 бита для хранения значений, это просто так, что есть 1 бит, который интерпретируется иначе, чем остальные.
Два дополнения чаще всего используются для хранения чисел, а это означает, что 1 бит не будет потрачен впустую только для знака.
В PHP, если число переполняет INT_MAX для платформы, оно преобразует его в значение с плавающей запятой.
из руководства: «Размер целого зависит от платформы, хотя максимальное значение около двух миллиардов – это обычное значение (это 32 бита). 64-разрядные платформы обычно имеют максимальное значение около 9E18. поддержка целых чисел без знака. Целочисленный размер может быть определен с использованием константы PHP_INT_SIZE и максимального значения с использованием константы PHP_INT_MAX с PHP 4.4.0 и PHP 5.0.5. «
Какое максимальное значение для int32?
Это была последняя тема между моей командой и я. Мы снимаем для покрытия 80% кода. Моя команда утверждает, что геттеры и сеттеры автоматически реализованы, и компилятор генерирует базовый код за кулисами. В этом случае, если генерируемый код не является навязчивым, на самом деле не имеет смысла тестировать код, создаваемый компилятором для вас. Мы также обсудили асинхронные методы, и в этом случае компилятор генерирует целую кучу кода за кулисами. Это другой случай и то, что мы тестируем. Длинный ответ короткий, поднимите его с вашей командой и решите для себя, если его стоит проверить.
Кроме того, если вы используете отчет о покрытии кода, подобный нам, вы можете добавить атрибут [ExcludeFromCodeCoverage]. Наше решение состояло в том, чтобы использовать это для моделей, которые имеют только свойства с использованием геттеров и сеттеров или самим свойством. Таким образом, это не повлияет на общий охват кода% при запуске отчета о покрытии кода, предполагая, что это то, что вы используете для расчета процентного охвата кода. Счастливое тестирование!
27 ответов
Это 2,147,483,647. Самый легкий способ запомнить его через татуировку.
В Objective-C (iOS и OSX) просто запомните эти макросы:
Запомните: 21 IQ ITEM 47
Его можно декодировать с любой телефонной панели, или вы можете просто записать его на бумаге.
Чтобы вспомнить «21 IQ ITEM 47», я бы сказал: «Hitman: Codename 47 имел 21 миссию, каждая из которых была IQ ITEM».
Или «Я чищу зубы каждый день в 21:47, потому что у меня высокий IQ и я не люблю предметы во рту».
(Groovy чрезвычайно полезен для справочника в контексте Java.)
Чтобы никогда не забывать максимальное значение любого типа:
Если оно имеет 32 бита, наибольшим возможным значением будут 32 бита с номером 1:
Результат будет 4294967295 в десятичном виде:
Но, как есть также представление отрицательных чисел, разделите 4294967295 на 2 и получите 2147483647.