Ваш вопрос: «Почему Java не поддерживает целые числа без знака»?
И мой ответ на ваш вопрос заключается в том, что Java хочет, чтобы все его примитивные типы: байт , char , short , int и long должны обрабатываться как байт , word , dword и qword соответственно, точно так же, как в сборке и операторы Java являются знаковыми операциями на всех примитивных типах, кроме char , но только на char они только 16-разрядные без знака.
Таким образом, статические методы предполагают операции без знака и как для 32, так и для 64-разрядных.
Вам нужен последний класс, статические методы которого можно вызывать для операций unsigned .
Вы можете создать этот последний класс, назвать его любым именем и реализовать его статические методы.
Если вы не знаете, как реализовать статические методы, тогда эта ссылка может вам помочь.
По моему мнению, Java не похожа на C ++ вообще , если она не не поддерживает неподписанные типы или перегрузки операторов, поэтому я считаю, что Java следует рассматривать как совершенно другой язык как из C ++, так и из C.
Между прочим, в названии языков оно также совершенно иное.
Так что я не рекомендую в Java набирать код, похожий на C, и вообще не рекомендую набирать код, похожий на C ++, потому что тогда в Java вы не сможете делать то, что хотите делать дальше. в C ++, т. е. код не будет по-прежнему похож на C ++, и для меня это плохо - кодировать так, менять стиль в середине.
Я рекомендую писать и использовать статические методы также для подписанных операций, так что вы не увидите в коде смеси операторов и статических методов как для подписанных, так и для неподписанных операций, если только вам не нужны только подписанные операции в коде, и разрешено использовать только операторы.
Также я рекомендую избегать использования short , int и long примитивных типов и использовать word , dword и qword соответственно, и вы собираетесь вызывать статические методы для операций без знака и / или операций со знаком вместо использования операторов.
Если вы собираетесь выполнять только подписанные операции и использовать операторы только в коде, тогда можно использовать эти примитивные типы short , int и long .
На самом деле word , dword и qword do n't существуют в языке, но вы можете создать новый класс для каждого и реализация каждого должна быть очень простой:
Класс word содержит тип примитива short , класс dword содержит только тип примитива int и класс qword содержит только примитивный тип long . Теперь все неподписанные и подписанные методы могут быть статическими или нет по вашему выбору, вы можете реализовать в каждом классе, то есть все 16-битные операции, как без знака, так и со знаком, давая значения имен в классе word , все 32-разрядные операции, как без знака, так и со знаком, дают значащие имена в классе dword , а все 64-разрядные операции, как без знака, так и со знаком, дают значащие имена в qword классе.
Если вам не нравится давать слишком много разных имен для каждого метода, вы всегда можете использовать перегрузку в Java, хорошо бы прочитать, что Java n't также удаляет это!
Если вам нужны методы, а не операторы для 8-битных операций со знаком и методы для 8-битных операций без знака, у которых вообще нет операторов, то вы можете создать класс Byte (обратите внимание, что первая буква 'B 'является заглавной, так что это не примитивный тип байт ), и реализуйте методы этого класса.
О передаче по значению и передаче по ссылке:
Если я не ошибаюсь, как в C #, примитивные объекты передаются по значению естественным образом, но объекты класса передаются по ссылке естественным образом, что означает, что объекты типа Byte , word , dword и qword будут передаваться по ссылке, а не по значению по умолчанию. Я бы хотел, чтобы у Java было struct объектов, как у C #,
так что все байт , слово , dword и qword могут быть реализованы, чтобы быть struct вместо класс , поэтому по умолчанию они передаются по значению, а не по ссылке по умолчанию, как и любой объект структуры в C #, как и примитивные типы, передаются по значению, а не по ссылке по умолчанию, а потому что Java хуже, чем C # и мы должны иметь дело с этим, то есть только классы и интерфейсы, которые передаются по ссылке, а не по значению по умолчанию. Поэтому, если вы хотите передать Byte , word , dword и qword объекты по значению, а не по ссылке, как любой другой объект класса в Java, а также в C # вам придется просто использовать конструктор копирования и все.
Это единственное решение, о котором я могу думать. Я просто хотел бы, чтобы я мог просто определить тип примитива для word, dword и qword, но Java не поддерживает typedef и вообще не использует его, в отличие от C #, который поддерживает с использованием , что эквивалентно typedef в C.
О выводе:
Для одной и той же последовательности битов вы можете печатать их разными способами: как двоичные, как десятичные (как значение% u в C printf), так и восьмеричные (как значение% o в C printf) как шестнадцатеричный (как значение% x в C printf) и как целое число (как значение% d в C printf).
Обратите внимание, что C printf не знает тип переменных, передаваемых в качестве параметров функции, поэтому printf знает тип каждой переменной только из объекта char *, переданного первому параметру функции.
Таким образом, в каждом из классов: Байт , word , dword и qword , вы можете реализовать метод print и получить функциональность printf, даже несмотря на то, что примитивный тип класса подписан, вы все равно можете напечатать его как unsigned, следуя некоторому алгоритму, включающему логические операции и операции сдвига, чтобы получить цифры для вывода на выход.
К сожалению, ссылка, которую я вам дал, не показывает, как реализовать эти методы печати, но я уверен, что вы можете поискать алгоритмы, необходимые для реализации этих методов печати, в Google.
Это все, что я могу ответить на ваш вопрос и предложить вам.