Ваше питання "Чому Java не підтримує неподписані вставки"?
І моя відповідь на ваше запитання полягає в тому, що Java хоче, щоб усі її примітивні типи: байт , char , короткий , int і long слід розглядати як байт , слово , dword і qword відповідно, точно так само, як у зборі, і оператори Java підписуються Операції з усіма його примітивними типами, крім char , але тільки на char вони не підписані лише 16 біт.
Таким чином, статичні методи можуть вважати операції без підпису і для 32, і для 64 біт.
Вам потрібен остаточний клас, статичні методи якого можна викликати для непідписаного операцій.
Ви можете створити цей остаточний клас, назвати його будь-яким ім'ям і реалізувати його статичними методами.
Якщо ви не маєте уявлення про те, як реалізувати статичні методи, тоді це посилання може вам допомогти.
На мій погляд, Java це НЕ схоже на C ++ взагалі , якщо він ні не підтримує беззнакові типи , ні перевантаження операторів, тому я думаю , що Java слід розглядати як абсолютно іншу мову як від C ++ і від C.
Це, до речі, також зовсім інше в назві мов.
Тому я не рекомендую в Java вводити код, подібний до C, і взагалі не рекомендую вводити код, схожий на C ++, тому що тоді на Java ви не зможете робити те, що хочете зробити далі в C ++, тобто код не буде продовжувати бути C ++, як взагалі, і для мене це погано кодувати таким чином, щоб змінити стиль посередині.
Я рекомендую писати та використовувати статичні методи також для підписаних операцій, так що ви не бачите в кодовій суміші операторів і статичних методів як для підписаних, так і для непідписаних операцій, якщо вам не потрібні лише підписані операції в коді, і це добре використовувати лише операторів.
Також я рекомендую уникати використання коротких , int та довгих примітивних типів, а замість цього використовувати слово word , dword та qword , і ви збираєтесь викликати статичні методи для непідписаних операцій та / або підписаних операцій замість використання операторів.
Якщо ви збираєтеся робити лише підписані операції та використовувати оператори лише в коді, тоді це нормально, щоб використовувати ці примітивні типи короткий , int та long .
На насправді слово , DWord і QWORD робити НЕ існує в мові, але ви можете створити новий клас для всіх і реалізація кожного має бути дуже легко:
Клас слово має примітивний тип короткий тільки клас DWORD має примітивний тип Int тільки і клас QWORD тримає примітивний тип довго тільки. Тепер усі непідписані та підписані методи як статичні чи не як ваш вибір, ви можете реалізувати у кожному класі, тобто всі 16-бітові операції як без підпису, так і підписані, надаючи значущі імена для класу word , всі 32-бітні операції як без підпису, так і підписується шляхом додавання значень імен класу dword та всіх 64-бітових операцій як без підпису, так і підписується шляхом надання значень імен класу qword .
Якщо вам не подобається давати занадто багато різних імен для кожного методу, ви завжди можете використовувати перевантаження в Java, добре читати, що Java теж не видаляла цього!
Якщо ви хочете скористатися методами, а не операторами для 8-бітових підписаних операцій та методів для 8-бітових безпідписаних операцій, у яких взагалі немає операторів, тоді ви можете створити клас Byte (зауважте, що перша літера "B" є великою літерою, тому це не примітивний тип байта ) та реалізувати методи цього класу.
Про проходження за значенням та проходження за посиланням:
Якщо я не помиляюся, як, наприклад, у C #, примітивні об'єкти передаються за значенням природним чином, але об'єкти класу передаються посиланням природним чином, так що це означає, що об'єкти типу Byte , word , dword та qword передаватимуться посиланням, а не значенням за замовчуванням. Я хочу Java мала STRUCT об'єктів в C # є, так що все Byte , слово , подвійне слово і QWORD можуть бути реалізовані як структура замість класу, тому за замовчуванням вони передавались за значенням, а не за посиланням за замовчуванням, як і будь-який структурний об'єкт у C #, як і примітивні типи, передаються за значенням, а не за посиланням за замовчуванням, а тому, що Java гірша за C # і ми маємо щоб вирішити це, тоді є лише класи та інтерфейси, які передаються посиланням, а не значенням за замовчуванням. Отже, якщо ви хочете передати об'єкти байт , слово , dword та qword за значенням, а не за посиланням, як і будь-який інший об’єкт класу на Java, а також на C #, вам доведеться просто використовувати конструктор копій, і все.
Це єдине рішення, про яке я можу подумати. Я просто хочу, щоб я міг просто вводитипримітивні типи до слова, dword та qword, але Java ні підтримує typedef, ні використовує зовсім, на відміну від C #, який підтримує використання , що еквівалентно typedef C.
Про вихід:
Для однієї і тієї ж послідовності бітів ви можете їх друкувати різними способами: як двійкові, як десяткові (як значення% u в C printf), як восьмеричні (як значення% o в C printf), так і шістнадцяткові (як значення% x в C printf) і як ціле число (як значення значення% d у printf).
Зауважте, що C printf не знає тип змінних, що передаються як параметри функції, тому printf знає тип кожної змінної лише з об'єкта char *, переданого першому параметру функції.
Отже, у кожному з класів: байт , слово , dword та qword , ви можете реалізувати метод друку та отримати функціональність printf, навіть незважаючи на те, що примітивний тип класу підписаний, ви все одно можете роздрукувати його як без підпису, дотримуючись деякий алгоритм, що включає логічні та зсувні операції, щоб отримати цифри для друку на вихід.
На жаль, посилання, яке я вам дав, не показує, як реалізувати ці методи друку, але я впевнений, що ви можете шукати в Google за алгоритмами, необхідними для реалізації цих методів друку.
Це все, що я можу відповісти на ваше запитання та запропонувати вам.