Arithmetic limitations

Expect the unexpected:

Figure 101. Strange things I Slide presentation
byte count = 91;   // o.K.

int i = 91;

byte count2 = i;   // Compile error: Incompatible types
                   // Required: byte Found: int

byte points = 130; // Compile error: Incompatible types
                   // Required: byte Found: int

Figure 102. Strange things II Slide presentation
final int i = 91;

byte count = i;   //  o.K.

Figure 103. Arithmetic overflow pitfalls Slide presentation
int count  = 2147483647;
int points = 2147483647;

int sum = count + points; 
System.out.println("Sum = "   +  sum);

Result:

Sum = -2
  01111111_11111111_11111111_11111111
+ 01111111_11111111_11111111_11111111
_____________________________________
  11111111_11111111_11111111_11111110

This exceeds the four byte limit of int variables. Thus the leading 1 will be discarded leaving us with a result of 11111111_11111111_11111111_11111110 equalling -2 with respect to four byte integer two complement representation.


Why not generally using float / double in favour of seemingly more limited byte, short, int, long for arithmetics?

Figure 104. Limited precision Slide presentation
float float2Power31 = Integer.MAX_VALUE + 1f; // 2^31

float floatDoubleMAX_VALUE = 2 * float2Power31 * float2Power31 - 1f; // 2^63 - 1

System.out.format( "   Float value: %f\n", floatDoubleMAX_VALUE);
System.out.println("Expected value: "   +  Long.MAX_VALUE);

Result:

   Float value: 9223372036854776000.000000
Expected value: 9223372036854775807
    Difference:                 193

Figure 105. Nearest float to 2.1 Slide presentation
//Print 15 floating point digits
DecimalFormat df = new DecimalFormat("#.###############");

System.out.println(df.format(Float.intBitsToFloat(0b0_10000000_00001100110011001100110  )));

System.out.println(df.format(Float.intBitsToFloat(0b0_10000000_00001100110011001100111  )));
2.099999904632568
2.100000143051147

Figure 106. FloatConverter Slide presentation
FloatConverter