For doing the splitting into the high and low words (or even each individual byte), you could try using a union/struct construction like this:
typedef union
{
struct
{
char b0;
char b1;
char b2;
char b3;
} pieces ;
int rawAddress;
}splitter;
Alternatively, you could use 2 unsigned shorts instead of the chars. Using this structure, accessing the first byte would look like this:
splitter mySplit;
mySplit.rawAddress = address;
char firstByte = mySplit.pieces.b0;
Since the union shares memory, it makes it quite easy to split the int and understand what is happening. Not sure about how efficient this is, although I wouldn't think that it would be worse than using multiple mathematical manipulations to achieve the same results.
-Michael Cox