If you don't specify unsigned before the data type then it will take signed by default.
So, in this case,
char val=250;
it is nothing but a signed character.
All the data type does have their range, range for the signed char is -128 to +127
Now, when you are trying to assign val as 250 (which is out of the range)
Binary representation of 250 is,
1111 1010
Now as you know, the first bit is considered as a signed bit so we have to take 1's complement of the same number and put minus before that (because of the signed bit)
1's complement of 250 is,
1111 1010 = 250
0000 0101 = 6
That's why even though you are assigning 250 to a signed char, it is taking -6.
And for the unsigned char value will be 250 itself because range of unsigned char is 0 to 255