To co, próbujesz zrobić, to wydrukowanie poszczególnych bajtów osobno, co w konsekwencji oznacza, że drukujesz interpretację dziesiętną trzech bajtów.
Tak swoją drogą, to używanie unii do tego typu operacji nie jest najlepszym pomysłem. Standard nie definiuje, czy faktycznie bajty z tablicy i będą pokrywały się z bajtami zmiennej typu short w unii, więc nie powinieneś "siekać" shorta przy użyciu tej tablicy. O ile pamiętam, to Grębosz w Symfonii C++ używa tego tricku, ale nie jest to najlepszy pomysł. Najczęściej jednak ten sposób działa, co wynika tylko ze sposobu implementacji przez autorów kompilatorów, a nie definicji standardu.
Co do rozwiązania, lepszym sposobem będzie użycie bitset:
#include <iostream>
#include <bitset>
int main()
{
short x;
std::cin >> x;
std::bitset<sizeof(short) * 8> x_bin(x);
std::cout << x_bin;
}
Jako parametr szablonu przyjmowany jest rozmiar sekwencji bitowej w bitach - w tym przypadku jest to rozmiar shorta (często 2 bajty) * liczba bitów w bajcie (najczęściej 8) - łącznie 16 bitów. Jako parametr konstruktora podana jest liczba, na podstawie której "powstanie" nasz bitset.
Oczywiście można też napisać własną funkcję, które wykorzysta operacje bitowego AND oraz przesunięcie bitowe do wyświetlenia liczby w jej reprezentacji dwójkowej.