You haven't shown your actual code (see below), but you've provided enough information to infer it:
signed char c = 0x8d << 3;
The constant 0x8d is of type int. Left-shifting it by 3 bits yields the value 0x468, or equivalently 1128.
The initialization implicitly converts that value from int to signed char. Since the value is outside the range of signed char (which presumably has a range of -128 to +127, unless you're on a very odd system), the result is implementation-defined. Typically the high-order bits are discarded, which would yield a result of 0x68, or 104.
The compiler is warning you that you're converting the value 1128 to signed char, which isn't big enough to hold it.
Perhaps you were expecting 0x8d to be of type signed char? It isn't. The type of an expression is almost always determined by the expression itself, not by the context in which it appears. Integer constants, either decimal, hexadecimal, or octal, are always of type int, unless they exceed the value of INT_MAX, which is at least 32767 (and probably 2147483647). (Or unless they have a suffix like L or U, but that's not relevant here.)
UPDATE :
You've shown us your original code:
signed char testChar = 0x8d << 3;
printf("testChar : %d\n", testChar);
I would expect this to produce a warning, since the value 1128 that you're using to initialize testChar causes an overflow. The value stored in testChar is implementation-defined, but it's very likely to be 104, the result of discarding the high-order bits.
If you split the shift into a separate assignment:
signed char testChar = 0x8d;
testChar = testChar << 3;
then I'd expect the same result. But the value 0x8d is too big to be stored in a signed char, so the conversion yields an implementation-defined result -- most likely -115. And a left-shift on a negative value has undefined behavior -- but again, it will probably yield -920, which when converted to signed char will probably give you 104.
Ultimately, the solution to your problem is to do something other than what you're trying to do. The value 0x8d << 3 will not fit into a signed char, and any attempt to make it fit is bound to cause problems. By tweaking the code, you might manage to silence the compiler's warnings, but you're still doing things that don't make sense.
104.