Los tipos enteros primitivos de Java (es decir, byte, short, int y long) están todos suscritos. Pero puedes evitar esto.
Para hacer (decir) aritmética sin signo de 32 bit, simplemente haz la aritmética pretendiendo que 'int' no está firmado. Por ejemplo, 2**31 - 1
es el valor más grande (firmado) int
. Si agrega uno obtendrá -2**31
. Pero ese patrón de bits es el mismo que +2**31
si considera que el int
no está firmado. Esto también funciona para la resta y la multiplicación. (No estoy seguro acerca de la división y el resto, pero lo más probable es que no importe para ti).
Comparar los valores de 32 bits sin signo es un poco más complicado. Por ejemplo, -1
es menor que +1
, pero si interpreta -1
como un valor sin signo obtendrá +2**32 - 1
que debería ser mayor que '+1'. Puede compensarlo traduciendo la desigualdad (dejaré que el lector lo resuelva) o lanzando los valores int
al long
, enmascarándolos con 0xffffffffL
y comparándolos como longs; p.ej.
int u1 = ...
int u2 = ...
if ((((long) u1) & 0xffffffff) < (((long) u2) & 0xffffffff) {
// u1 represents a smaller unsigned value than u2
}
La conversión de enteros sin signo de 32 bits a Strings es más fácil con longs; p.ej.
String str = Long.toString(((long) u1) & 0xffffffffL);
Ahora voy a admitir libremente que el uso de int
para representar valores sin signo de 32 bits es complicado, y potencialmente propenso a errores. Una solución más limpia sería usar long
en todo o si su aplicación necesita valores sin firmar de 64 bits para usar BigInteger
.
ACTUALIZACIÓN - se ve Java 8 tendrá soporte (en forma de métodos de biblioteca) para el tratamiento de int
y long
tipos como sin firmar - ver "Unsigned Integer Arithmetic API now in JDK 8" por Joseph Darcy @ Oracle.
En Java todos los tipos de enteros (excepto char) son firmado. – mob
¿Qué protocolo usas? Si envía algo al servidor, el "algo" y cómo se envía es importante, no su representación interna. Creo que su pregunta debería sonar como: "¿Cómo envío números sin firmar usando corba/RMI/Hessian/t3/iiop/http/.....?" –