Monday, March 11, 2019

Don’t Cross The Data Types

Remember in the first Ghostbusters movie where the ghostbusters are told not to cross the stream of their ghost busting guns? And then at the end they do cross the streams? Mixing data types is like that some times. You really have to know what you are doing when you mix data types.

The Facebook group for AP CS A teachers recently had this Java example:

Can anyone explain why a + b is NaN but a+=b is zero?
int a = 0;
int x = 0, y = 0;
double b = (double)x/y;
System.out.println("a: "+ a);
System.out.println("b: "+ b);
System.out.println("a + b: "+(a+b));
a += b;
System.out.println("a(2): " + a);


a: 0
b: NaN
a + b: NaN
a(2): 0

NaN is not a number and is the result of the divide by zero. You probably shouldn’t do that anyway but it happens. What is interesting here is the different way that (a + b) is handled compared to a += b

a += b does a conversion of b to integer before it does the addition while (a + b) does a conversion of a to double. That explains the different results. Of course if you were to do a = (a + b) you would probably get a compiler complaint. I think. I know you would in C# but I haven’t tried Java yet. FWIW C# also complains about a += b and demands an explicit cast. Different languages and compilers handle these things differently.

So what is the message here? I think the message is that programmers should usually make explicit casts when they mix variable types. Maybe you know what will be cast to what for different variable types and different operations but a) how much do you want to bet you’re right and b) how much to you want to bet that the next person to look at your code will understand what is going on behind the scenes?

Mixing types causes a lot of confusion for beginners. SO does how numbers are stored (some kids never seem to understand that 0.1 is an infinitely repeating fraction in binary and what that means) of course. Encouraging students to cast or at least to be very careful about the types they use and the types they mix is an important lesson.

1 comment:

Garth said...

This is one of the problems I have when my kids go from Python to Java. The stricter types get them all the time. I have to watch it myself. It is amazing how little time is spent on this issue in the texts I have seen. This is a big issue with beginners and should have some pretty heavy coverage.