Search code examples
javaunsigned-integer

Unsigned int (primitive) and Integer (Object) usage in Java


I'm following the Java tutorial on Primitive Data Types. Early on, it states that

In Java SE 8 and later, you can use the int data type to represent an unsigned 32-bit integer, which has a minimum value of 0 and a maximum value of 2^32-1. Use the Integer class to use int data type as an unsigned integer.

What I'm understanding from this quote is that I can now store up to 2^32-1 as an int as long as I use the Integer wrapper object rather than the int primitive data type. But when I tried this out, my compiler is complaining that the value I'm using is too large, 2^31. I've tried this using both the primitive data type and Object.

Integer integerObjectLarge = 2147483648; //2^31
int integerPrimitiveLarge = 2147483648; //2^31

How exactly do I use an int/Integer to store unsigned value, such as 2^31?


Solution

  • But when I tried this out, my compiler is complaining that the value I'm using is too large, 2^31.

    You have an error because the literal 2147483648 is syntactically invalid.


    How exactly do I use an int/Integer to store unsigned value, such as 2^31?

    You can still perform unsigned arithmetic using the new methods of the Integer class, just don't use invalid literals:

    int n = 2147483647 + 1;  // 2^31
    
    System.out.println(Integer.toUnsignedString(n));  // treat int as unsigned
    System.out.println(Integer.toString(n));          // treat int as signed
    
    2147483648
    -2147483648
    

    What I'm understanding from this quote is that I can now store up to 2^32-1 as an int as long as I use the Integer wrapper object rather than the int primitive data type.

    You can store the unsigned int using the primitive type int, but using the value as an unsigned type requires you to use the utility methods of Integer, as can be seen above.