Sua pergunta é "Por que o Java não suporta entradas não assinadas"?
E minha resposta para sua pergunta é que o Java quer que todos os seus tipos primitivos: byte , char , short , int e long sejam tratados como byte , word , dword e qword respectivamente, exatamente como no assembly, e os operadores Java sejam assinados operações em todos os seus tipos primitivos, exceto char , mas somente em char eles não têm assinatura de 16 bits.
Portanto, os métodos estáticos supõem ser as operações não assinadas também para 32 e 64 bits.
Você precisa da classe final, cujos métodos estáticos podem ser chamados para o não assinado operações .
Você pode criar essa classe final, chamá-la como quiser e implementar seus métodos estáticos.
Se você não tem idéia de como implementar os métodos estáticos, este link pode ajudá-lo.
Na minha opinião, Java é não semelhante a C ++ em tudo , se ele não suportar tipos não assinados nem sobrecarga de operadores, então eu acho que o Java deve ser tratado como idioma completamente diferente tanto C ++ e de C.
A propósito, também é completamente diferente no nome dos idiomas.
Portanto, não recomendo em Java digitar código semelhante ao C e não recomendo digitar código semelhante ao C ++, porque, em Java, você não poderá fazer o que deseja fazer em C ++, ou seja, o código não continuará sendo como o C ++ e, para mim, é ruim codificar dessa maneira, mudar o estilo no meio.
Eu recomendo escrever e usar métodos estáticos também para as operações assinadas, para que você não veja na mistura de códigos operadores e métodos estáticos para operações assinadas e não assinadas, a menos que você precise apenas de operações assinadas no código e não há problema em use apenas os operadores.
Também recomendo evitar o uso de tipos primitivos curtos , int e longos e , em vez disso, use word , dword e qword respectivamente, e você deve chamar os métodos estáticos para operações não assinadas e / ou operações assinadas, em vez de usar operadores.
Se você estiver prestes a executar apenas operações assinadas e usar os operadores apenas no código, não há problema em usar esses tipos primitivos short , int e long .
Na verdade palavra , dword e QWORD que não existe na língua, mas você pode criar nova classe para cada um e a implementação de cada um deve ser muito fácil:
A palavra da classe mantém apenas o tipo primitivo curto , a classe dword mantém o tipo primitivo int apenas e a classe qword mantém apenas o tipo primitivo por muito tempo . Agora, todos os métodos não assinados e assinados são estáticos ou não, conforme sua escolha, você pode implementar em cada classe, ou seja, todas as operações de 16 bits não assinadas e assinadas, fornecendo nomes de significado na palavra classe, todas as operações de 32 bits não assinadas e assinado dando nomes de significado na classe dword e todas as operações de 64 bits não assinadas e assinadas dando nomes de significado na classe qword .
Se você não gosta de dar muitos nomes diferentes para cada método, sempre pode usar sobrecarga em Java, é bom ler que o Java não removeu isso também!
Se você deseja métodos, em vez de operadores para operações assinadas de 8 bits e métodos para operações não assinadas de 8 bits que não possuem operadores, crie a classe Byte (observe que a primeira letra 'B' é maiúscula, portanto essa não é a byte do tipo primitivo ) e implemente os métodos nesta classe.
Sobre passar por valor e passar por referência:
Se não estou errado, como em C #, objetos primitivos são passados por valor naturalmente, mas objetos de classe são passados por referência naturalmente, o que significa que objetos do tipo Byte , word , dword e qword serão passados por referência e não por valor por padrão. Eu gostaria que o Java tivesse objetos struct como o C #, para que todos os bytes , palavras , dword e qword pudessem ser implementados para serem struct em vez de classe, portanto, por padrão, eles foram passados por valor e não por referência por padrão, como qualquer objeto struct em C #, como os tipos primitivos, são passados por valor e não por referência por padrão, mas porque esse Java é pior que C # e temos Para lidar com isso, existem apenas classes e interfaces que são passadas por referência e não por valor por padrão. Portanto, se você deseja passar os objetos Byte , word , dword e qword por valor e não por referência, como qualquer outro objeto de classe em Java e também em C #, terá que simplesmente usar o construtor de cópia e pronto .
Essa é a única solução em que consigo pensar. Eu gostaria de poder apenas digitar os tipos primitivos em word, dword e qword, mas o Java não suporta typedef nem usa nada, ao contrário do C # que suporta o uso , que é equivalente ao typedef do C.
Sobre a saída:
Para a mesma sequência de bits , você pode imprimi-los de várias maneiras: como binário, decimal (como o significado de% u em C printf), como octal (como o significado de% o em C printf), como hexadecimal (como o significado de% x em C printf) e como número inteiro (como o significado de% d em C printf).
Observe que C printf não sabe o tipo das variáveis que estão sendo passadas como parâmetros para a função, portanto printf conhece o tipo de cada variável apenas do objeto char * passado para o primeiro parâmetro da função.
Portanto, em cada uma das classes: Byte , word , dword e qword , é possível implementar o método print e obter a funcionalidade do printf, mesmo que o tipo primitivo da classe seja assinado, você ainda pode imprimi-lo como não assinado, seguindo algum algoritmo envolvendo operações lógicas e de deslocamento para obter os dígitos a serem impressos na saída.
Infelizmente, o link que forneci não mostra como implementar esses métodos de impressão, mas tenho certeza de que você pode pesquisar no Google os algoritmos necessários para implementar esses métodos de impressão.
É tudo o que posso responder à sua pergunta e sugerir você.