short is not 1 byte, it's usually 2 bytes. One byte is char (and its signed/unsigned variants), which just happens to be the types for which the result of such cast is legal to access.
long is also not necessarily 4 bytes, e.g. it is 8 on the platform I'm using:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
#include <iostream>
int main()
{
unsignedlong data = 0x0010;
unsignedint N = 2;
unsignedlong* MyPt = &data;
unsignedchar* MyBytePt = reinterpret_cast<unsignedchar*>(MyPt);
MyBytePt[N] = 0x12;
std::cout << "size of long is " << sizeof data << '\n'
<< std::hex << std::showbase << *MyPt << '\n';
}