Bitshifting bytes to form a long var fails!

That won't do you justice.

For starters you don't write anything to the most significant byte. A variable declared on the stack will have an undefined contents until initialised or assigned. Therefore you read rubbish data off the stack.

Secondly you don't combine the data properly, you mask away the bits of 'high_nibble'

And no, apart from the fact the code is unusable, it is not faster.

This is probably what you intended.

  uc_ptr = (unsigned char *) &address;
  *uc_ptr++ = (( d << 4 ) | e);
  *uc_ptr++ = (( b << 4 ) | c);
  *uc_ptr++ = a;
  *uc_ptr = 0;

Which also is slower than a union construct.