I saw this question on SO about casting, and the answer specifically mentioned numeric types. I thought I understood this till now, when I have to do it.
I have two int's I want to add, divide by two and save to another int. So I create a temporary variable called 'bucket' that's one datatype bigger, add the two ints and shift right by one.
I've come up with several ways to do this, all seem to work, but several are, I think, unnecessary. Please look this over and let me know where I misunderstood K&R.
Case1:
bucket = ( (long) ADCBUF0 + (long) ADCBUF7) >> 1;
rem_volt = bucket;
Case 2:
bucket = ( (long) ADCBUF1 + (long) ADCBUF8) >> 1;
loc_volt = (unsigned int) bucket;
Case 3:
bucket = (long) ADCBUF2 + (long) ADCBUF9;
current = (unsigned int) (bucket >> 1);
Case 4:
bucket = ADCBUF3 + ADCBUFA;
dac_A = (unsigned int) (bucket >> 1);
Case 5:
bucket = (long) (ADCBUF4 + ADCBUFB) >> 1;
dac_B = (unsigned int) bucket;
I think Case 4 or Case 5 is the correct way to do this, since Case 1 implicitly casts a long to an int, Case 2 I think is right, but more typing, Case 3 I think uneccessarily casts the ints to longs when only their sum needs to be cast.
Thanks for your thoughts.
EDIT: Thanks for the comments so far! To clarify, I am being sloppy about the unsigned vs signed, they should all be unsigned. I am trying to avoid an overflow on the addition. My long is 2 bytes bigger than my int. (So it's really much bigger than needed, I could just check the overflow bit.) I'm working on an embedded platform, I will never port this (I swear!) but I am trying to consider whomever comes after me and tries to puzzle out what I'm doing, so I'll use the divide by 2 rather than the bitshift.