Su pregunta es "¿Por qué Java no admite ints sin firmar"?
Y mi respuesta a su pregunta es que Java quiere que todos sus tipos primitivos: byte , char , short , int y long se traten como byte , word , dword y qword respectivamente, exactamente como en el ensamblado, y los operadores Java están firmados operaciones en todos sus tipos primitivos excepto char , pero solo en char son solo 16 bits sin signo.
Por lo tanto, los métodos estáticos suponen ser las operaciones sin firmar también para 32 y 64 bits.
Necesita la clase final, cuyos métodos estáticos se pueden llamar para los no firmados operaciones .
Puedes crear esta clase final, llamarla como quieras e implementar sus métodos estáticos.
Si no tiene idea de cómo implementar los métodos estáticos, entonces este enlace puede ayudarlo.
En mi opinión, Java no es similar a C ++ en absoluto , si no admite tipos sin signo ni sobrecarga de operadores, por lo que creo que Java debería tratarse como un lenguaje completamente diferente tanto de C ++ como de C.
Por cierto, también es completamente diferente en el nombre de los idiomas.
Por lo tanto, no recomiendo en Java escribir código similar a C y no recomiendo escribir código similar a C ++ en absoluto, porque entonces en Java no podrá hacer lo que quiere hacer a continuación en C ++, es decir, el código no seguirá siendo C ++ como para nada y para mí es malo codificar así, cambiar el estilo en el medio.
Recomiendo escribir y usar métodos estáticos también para las operaciones firmadas, para que no vea en la combinación de códigos de operadores y métodos estáticos tanto para operaciones firmadas como no firmadas, a menos que solo necesite operaciones firmadas en el código, y está bien use solo los operadores.
También recomiendo evitar el uso de tipos primitivos cortos , int y largos , y usar word , dword y qword respectivamente, y se trata de llamar a los métodos estáticos para operaciones sin signo y / o operaciones con signo en lugar de usar operadores.
Si está a punto de realizar operaciones firmadas únicamente y usa los operadores solo en el código, entonces está bien usar estos tipos primitivos short , int y long .
En realidad la palabra , dword y QWord hacer no existe en la lengua, pero se puede crear nueva clase de cada uno y la implementación de cada uno debe ser muy fácil:
La palabra de clase mantiene el tipo primitivo solo corto , la clase dword contiene el tipo primitivo int solamente y la clase qword solo mantiene el tipo primitivo largo . Ahora, todos los métodos sin signo y con signo como estáticos o no como su elección, puede implementar en cada clase, es decir, todas las operaciones de 16 bits sin signo y firmadas dando nombres de significado en la clase de palabra , todas las operaciones de 32 bits sin signo y firmado dando nombres de significado en la clase dword y todas las operaciones de 64 bits sin signo y firmadas dando nombres de significado en la clase qword .
Si no le gusta dar muchos nombres diferentes para cada método, siempre puede usar la sobrecarga en Java, ¡es bueno leer que Java no eliminó eso también!
Si desea métodos en lugar de operadores para operaciones con signo de 8 bits y métodos para operaciones sin signo de 8 bits que no tienen ningún operador, puede crear la clase Byte (tenga en cuenta que la primera letra 'B' es mayúscula, por lo que este no es el byte de tipo primitivo ) e implementar los métodos en esta clase.
Acerca de pasar por valor y pasar por referencia:
Si no me equivoco, como en C #, los objetos primitivos se pasan por valor de forma natural, pero los objetos de clase se pasan por referencia de forma natural, lo que significa que los objetos de tipo Byte , word , dword y qword se pasarán por referencia y no por valor por defecto. Desearía que Java tuviera objetos struct como C #, por lo que todos los bytes , word , dword y qword podrían implementarse para ser struct en lugar de class, de manera predeterminada, se pasaron por valor y no por referencia de manera predeterminada, como cualquier objeto de estructura en C #, como los tipos primitivos, se pasan por valor y no por referencia de manera predeterminada, sino porque Java es peor que C # y tenemos para lidiar con eso, solo hay clases e interfaces, que se pasan por referencia y no por valor por defecto. Entonces, si desea pasar los objetos Byte , word , dword y qword por valor y no por referencia, como cualquier otro objeto de clase en Java y también en C #, simplemente tendrá que usar el constructor de copia y listo .
Esa es la única solución en la que puedo pensar. Solo desearía poder escribir los tipos primitivos para word, dword y qword, pero Java no admite typedef ni usa en absoluto, a diferencia de C # que admite el uso , que es equivalente al typedef de C.
Sobre salida:
Para la misma secuencia de bits , puede imprimirlos de muchas maneras: como binario, como decimal (como el significado de% u en C printf), como octal (como el significado de% o en C printf), como hexadecimal (como el significado de% x en C printf) y como entero (como el significado de% d en C printf).
Tenga en cuenta que C printf no conoce el tipo de las variables que se pasan como parámetros a la función, por lo que printf conoce el tipo de cada variable solo desde el objeto char * pasado al primer parámetro de la función.
Entonces, en cada una de las clases: Byte , word , dword y qword , puede implementar el método de impresión y obtener la funcionalidad de printf, aunque el tipo primitivo de la clase está firmado, aún puede imprimirlo como no firmado siguiendo algunos algoritmos que involucran operaciones lógicas y de cambio para obtener los dígitos para imprimir en la salida.
Desafortunadamente, el enlace que le di no muestra cómo implementar estos métodos de impresión, pero estoy seguro de que puede buscar en Google los algoritmos que necesita para implementar estos métodos de impresión.
Eso es todo lo que puedo responder a su pregunta y sugerirle.