You are victim of casting to the default type, namely int (signed).
In this line the sub-expressions like "byte1 << 24" are cast to the default int type,
which is signed 16 bit.
recomb = byte1 << 24 | byte2 << 16 | byte3 << 8 | byte4;
How about using something like this:
recomb = byte1 ;
recomb = (recomb << 8) | byte2 ;
recomb = (recomb << 8) | byte3 ;
recomb = (recomb << 8) | byte4 ;
in which all the intermediate expressions are unsigned. (Caveat, I haven't tested this)