You didn't get the result you expected because bytes are laid out on 8 bit boundaries, so adjacent binary byte values are scaled by 25610, not 1010.
Also, if you cast the type of something and dereference it, the compiler will compile it but technically your program is nonconforming.*
One problem is alignment. If you change the type with open code it may not begin at the right boundary, and it may not be big enough. You can fix all that with a union. It's still nonconforming and the result is not specified, but in practice it is reliable and even somewhat portable, if you don't mind different results depending on byte order and int size.
union a {
char c[3];
int i;
short s;
} a;
This might also be a good application for <stdint.h>
, but that's a topic for another question.
*You might wonder, then, why casts exist ... it's because (A) despite being banned by the standard, type punning is widely used in existing C programs and particularly in operating software, and (B) there are mostly-conforming uses that define generic interfaces but always (or, ahem usually) cast the thing back to the original type before dereferencing it.