La tua domanda è "Perché Java non supporta gli integ non firmati"?
E la mia risposta alla tua domanda è che Java vuole che tutti i suoi tipi primitivi: byte , char , short , int e long debbano essere trattati rispettivamente come byte , word , dword e qword , esattamente come nell'assembly, e gli operatori Java sono firmati operazioni su tutti i suoi tipi primitivi ad eccezione di char , ma solo su char sono senza segno solo a 16 bit.
Quindi i metodi statici suppongono di essere le operazioni senza segno anche per 32 e 64 bit.
È necessaria la classe finale, i cui metodi statici possono essere chiamati per le operazioni non firmate .
Puoi creare questa classe finale, chiamarla come vuoi e implementare i suoi metodi statici.
Se non hai idea di come implementare i metodi statici, questo link potrebbe aiutarti.
A mio parere, Java è non è simile a C ++ a tutti , se non supporta i tipi senza segno né l'overloading degli operatori, quindi penso che Java deve essere trattato come linguaggio completamente diverso sia da C ++ e da C.
A proposito, è anche completamente diverso nel nome delle lingue.
Quindi non consiglio a Java di digitare un codice simile a C e non consiglio di digitare un codice simile a C ++, perché in Java non potrai fare quello che vuoi fare in C ++, cioè il codice non continuerà ad essere C ++ come per niente e per me è un male codificare in quel modo, per cambiare lo stile nel mezzo.
Consiglio di scrivere e usare metodi statici anche per le operazioni firmate, quindi non vedete nella combinazione di codice di operatori e metodi statici per operazioni firmate e non firmate, a meno che non siano necessarie solo operazioni firmate nel codice, e va bene utilizzare solo gli operatori.
Inoltre consiglio di evitare l'uso di tipi primitivi short , int e long e di utilizzare rispettivamente word , dword e qword , e si sta per chiamare i metodi statici per operazioni senza segno e / o operazioni con segno invece di usare operatori.
Se stai per eseguire solo operazioni firmate e utilizzare gli operatori solo nel codice, va bene usare questi tipi primitivi short , int e long .
In realtà la parola , DWORD e QWORD non non esiste nella lingua, ma è possibile creare nuova classe per ciascuno e per l'attuazione di ogni dovrebbe essere molto semplice:
La classe di parola detiene il tipo primitivo breve solo, la classe DWORD detiene il tipo primitivo int solo e la classe QWORD detiene il tipo primitivo lungo solo. Ora tutti i metodi senza segno e firmati come statici o meno come la tua scelta, puoi implementare in ogni classe, cioè tutte le operazioni a 16 bit sia senza segno che firmate dando nomi significativi sulla classe di parole , tutte le operazioni a 32 bit sia senza segno che con firmato dando nomi di significato sulla classe dword e tutte le operazioni a 64 bit sia senza segno che firmato dando nomi di significato sulla classe qword .
Se non ti piace dare troppi nomi diversi per ogni metodo, puoi sempre usare il sovraccarico in Java, bene leggere che Java non lo ha rimosso!
Se desideri metodi anziché operatori per operazioni con segno a 8 bit e metodi per operazioni senza segno a 8 bit che non hanno alcun operatore, puoi creare la classe Byte (nota che la prima lettera 'B' è maiuscola, quindi questa non è la byte di tipo primitivo ) e implementare i metodi in questa classe.
Informazioni sul passaggio per valore e passaggio per riferimento:
Se non sbaglio, come in C #, gli oggetti primitivi vengono passati per valore in modo naturale, ma gli oggetti di classe vengono passati per riferimento in modo naturale, quindi ciò significa che gli oggetti di tipo Byte , word , dword e qword verranno passati per riferimento e non per valore per impostazione predefinita. Vorrei che Java avesse oggetti struct come C #, quindi tutti i byte , word , dword e qword potevano essere implementati per essere strutt invece che di classe, quindi per impostazione predefinita sono stati passati per valore e non per riferimento per impostazione predefinita, come qualsiasi oggetto struct in C #, come i tipi primitivi, vengono passati per valore e non per riferimento per impostazione predefinita, ma poiché Java è peggiore di C # e abbiamo per far fronte a questo, allora ci sono solo classi e interfacce, che vengono passate per riferimento e non per valore per impostazione predefinita. Quindi, se vuoi passare oggetti Byte , word , dword e qword per valore e non per riferimento, come qualsiasi altro oggetto di classe in Java e anche in C #, dovrai semplicemente usare il costruttore di copie e il gioco è fatto.
Questa è l'unica soluzione a cui posso pensare. Vorrei solo poter digitare i tipi primitivi in word, dword e qword, ma Java non supporta typedef né utilizza affatto, diversamente da C # che supporta l' utilizzo , che equivale al typedef di C.
Informazioni sull'output:
Per la stessa sequenza di bit , puoi stamparli in molti modi: come binario, come decimale (come il significato di% u in C printf), come ottale (come il significato di% o in C printf), come esadecimale (come il significato di% x in C printf) e come numero intero (come il significato di% d in C printf).
Si noti che C printf non conosce il tipo di variabili che vengono passate come parametri alla funzione, quindi printf conosce il tipo di ogni variabile solo dall'oggetto char * passato al primo parametro della funzione.
Quindi in ciascuna delle classi: byte , word , dword e qword , è possibile implementare il metodo di stampa e ottenere la funzionalità di printf, anche se il tipo primitivo della classe è firmato, è comunque possibile stamparlo come non firmato seguendo alcuni algoritmi che coinvolgono operazioni logiche e di spostamento per far stampare le cifre sull'output.
Sfortunatamente il link che ti ho fornito non mostra come implementare questi metodi di stampa, ma sono sicuro che puoi cercare su Google gli algoritmi necessari per implementare questi metodi di stampa.
Questo è tutto ciò che posso rispondere alla tua domanda e suggerirti.