You had it all right (assuming Big Endian at least) up until the diagram with all the E's. You've actually performed ptr -= 1; in that diagram.
A longer type extends to occupying more memory in the positive direction, i.e. the direction you go when you increment the pointer. Here's a little endian demo:
char *ptr;
Code:
+--------+--------+--------+--------+
|xxxxxxxx| | | |
+--------+--------+--------+--------+
*ptr = 6;
Code:
+--------+--------+--------+--------+
|00000110| | | |
+--------+--------+--------+--------+
short *ptr2 = (short*)ptr;
Code:
+--------+--------+--------+--------+
|00000110|xxxxxxxx| | |
+--------+--------+--------+--------+
*ptr2 = 9;
Code:
+--------+--------+--------+--------+
|00001001|00000000| | |
+--------+--------+--------+--------+
ptr2++;
Code:
+--------+--------+--------+--------+
| | |xxxxxxxx|xxxxxxxx|
+--------+--------+--------+--------+
*ptr2 = 10;
Code:
+--------+--------+--------+--------+
| | |00001010|00000000|
+--------+--------+--------+--------+
long *ptr3 = (long*)ptr;
Code:
+--------+--------+--------+--------+
|00000110|00000000|00001010|00000000|
+--------+--------+--------+--------+