In here
When converting from bytes buffer back to unsigned long int:
unsigned long int anotherLongInt;
anotherLongInt = ( (byteArray[0] << 24)
+ (byteArray[1] << 16)
+ (byteArray[2] << 8)
+ (byteArray[3] ) );
where byteArray is declared as unsigned char byteArray[4];
Question:
I thought byteArray[1] would be just one unsigned char (8 bit). When left-shifting by 16, wouldn’t that shift all the meaningful bits out and fill the entire byte with 0? Apparently it is not 8 bit. Perhaps it’s shifting the entire byteArray which is a consecutive 4 byte? But I don’t see how that works.
In that arithmetic context
byteArray[0]is promoted to eitherintorunsigned int, so the shift is legal and maybe even sensible (I like to deal only withunsignedtypes when doing bitwise stuff).And integer promotions: