I tipi interi primitivi di Java (cioè byte, short, int e long) sono tutti firmati. Ma puoi aggirare questo.
Per fare (dire) aritmetica senza segno a 32 bit, basta fare l'aritmetica fingendo che 'int' non sia firmato. Ad esempio, 2**31 - 1
è il più grande (firmato) valore int
. Se ne aggiungi uno, otterrai -2**31
. Ma quel modello di bit è lo stesso di +2**31
se pensi allo int
come non firmato. Questo funziona anche per la sottrazione e la moltiplicazione. (Non sono sicuro della divisione e del resto, ma è probabile che non sia importante per te).
Il confronto dei valori a 32 bit senza segno è un po 'più complicato. Ad esempio, -1
è inferiore a +1
, ma se interpreti -1
come valore senza segno ottieni +2**32 - 1
che dovrebbe essere maggiore di "+1". È possibile compensare traducendo la disuguaglianza (lascerò il lettore al computer per capirlo) o convertendo i valori int
in long
, mascherandoli con 0xffffffffL
e confrontandoli come lunghi; per esempio.
int u1 = ...
int u2 = ...
if ((((long) u1) & 0xffffffff) < (((long) u2) & 0xffffffff) {
// u1 represents a smaller unsigned value than u2
}
Conversione di numeri interi senza segno a 32 bit in Stringhe è un'operazione più semplice che si esegue utilizzando i caratteri lunghi; per esempio.
String str = Long.toString(((long) u1) & 0xffffffffL);
ora mi liberamente ammettere che l'uso int
per rappresentare 32 bit valori senza segno è difficile, e potenzialmente soggetto a errori. Una soluzione più pulita sarebbe quella di utilizzare long
in tutto o se l'applicazione richiede valori senza segno a 64 bit per utilizzare BigInteger
.
UPDATE - sembra Java 8 avrà il supporto (sotto forma di metodi di libreria) per il trattamento di int
e long
tipi senza segno - vedere "Unsigned Integer Arithmetic API now in JDK 8" da Joseph Darcy @ Oracle.
fonte
2009-10-16 06:57:59
In Java tutti i tipi interi (eccetto char) sono firmato. – mob
Che protocollo usi? Se invii qualcosa al server, il "qualcosa" e come viene inviato è importante, non la tua rappresentazione interna. Penso che la tua domanda dovrebbe essere: "Come faccio a inviare numeri senza segno usando corba/RMI/Hessian/t3/iiop/http/.....?" –