Ваш вопрос «Почему Java не поддерживает беззнаковые целые»?
И мой ответ на ваш вопрос заключается в том, что Java хочет, чтобы все ее примитивные типы: byte , char , short , int и long обрабатывались как байты , word , dword и qword соответственно, точно так же, как в сборке, а операторы Java подписаны операции на всех его примитивных типах, кроме char , но только на char они только 16-битные без знака.
Таким образом, статические методы предполагают, что они являются операциями без знака также для 32- и 64-разрядных.
Вам нужен последний класс, чьи статические методы могут быть вызваны для операций без знака .
Вы можете создать этот последний класс, назвать его как угодно и реализовать его статические методы.
Если вы не знаете, как реализовать статические методы, эта ссылка может вам помочь.
На мой взгляд, Java это не похоже на C ++ вообще , если он ни не поддерживает беззнаковые типы , ни перегрузку операторов, поэтому я думаю , что Java следует рассматривать как совершенно другой язык как от C ++ и от C.
Между прочим, в названии языков оно также совершенно иное.
Поэтому я не рекомендую в Java набирать код, похожий на C, и вообще не рекомендую набирать код, похожий на C ++, потому что тогда в Java вы не сможете делать то, что хотите делать дальше в C ++, т. е. код не будет по-прежнему похож на C ++, и для меня это плохо - кодировать так, менять стиль посередине.
Я рекомендую писать и использовать статические методы также для подписанных операций, поэтому вы не увидите в коде смеси операторов и статических методов для подписанных и неподписанных операций, если только вам не нужны только подписанные операции в коде, и это нормально используйте только операторы.
Кроме того, я рекомендую не использовать короткие , Int и длинные примитивные типы, а также использовать слово , двойное слово и QWORD соответственно вместо этого, и вы об вызвать статические методы для неподписанных операций и / или подписаны операции вместо использования операторов.
Если вы собираетесь выполнять только подписанные операции и использовать операторы только в коде, тогда можно использовать эти примитивные типы short , int и long .
На самом деле слово , двойное слово и QWORD ничего не существует в языке, но вы можете создать новый класс для всех и реализация каждого должно быть очень легко:
Слово класса содержит только примитивный тип short , класс dword содержит только примитивный тип int, а класс qword содержит только примитивный тип long . Теперь все неподписанные и подписанные методы как статические или нет по вашему выбору, вы можете реализовать в каждом классе, то есть все 16-битные операции, как без знака, так и со знаком, давая значения имен в классе слова , все 32-битные операции как без знака, так и подписывается, давая значащие имена в классе dword, и все 64-битные операции как без знака, так и подписывается, давая значащие имена в классе qword .
Если вам не нравится давать слишком много разных имен для каждого метода, вы всегда можете использовать перегрузку в Java, хорошо читать, что Java тоже не удаляла это!
Если вам нужны методы, а не операторы для 8-битных операций со знаком и методы для 8-битных операций без знака, у которых вообще нет операторов, то вы можете создать класс Byte (обратите внимание, что первая буква «B» - это заглавная, так что это не примитивный тип byte ) и реализует методы этого класса.
О передаче по значению и передаче по ссылке:
Если я не ошибаюсь, как в C #, примитивные объекты передаются по значению естественным образом, но объекты класса передаются по ссылке естественным образом, что означает, что объекты типа Byte , word , dword и qword будут передаваться по ссылке, а не по значению по умолчанию. Я хочу Java имела STRUCT объектов в C # есть, так что все Byte , слово , двойное слово и QWORD могут быть реализованы как структура вместо классапоэтому по умолчанию они передаются по значению, а не по ссылке по умолчанию, как любой объект структуры в 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 *, переданного первому параметру функции.
Таким образом, в каждом из классов: Byte , word , dword и qword вы можете реализовать метод print и получить функциональность printf, даже если примитивный тип класса подписан, вы все равно можете напечатать его как unsigned, следуя некоторому алгоритму, включающему логические и сдвиговые операции для получения цифр для вывода на выход.
К сожалению, ссылка, которую я вам дал, не показывает, как реализовать эти методы печати, но я уверен, что вы можете поискать алгоритмы, необходимые для реализации этих методов печати.
Это все, что я могу ответить на ваш вопрос и предложить вам.