They print all the same because you use only short
in your union.
What you might want to write instead would be:
union HexNumber {
int full_number; // assuming 'int' is 4-bytes; int32_t would be
unsigned char b[4]; // uint8_t would be better
} theNumber;
theNumber.full_number = number;
std::cout << std::hex << (int)theNumber.b[0] << " " << (int)theNumber.b[1]
<< " " << (int)theNumber.b[2] << " " << (int)theNumber.b[3] << std::endl;