hi shonak,
well i think ppl yet answered haven't underestood ur questn.....right???
well if i've understood it correctly

then the simple answer is :
byte b = 27 //1 legal
byte b = 127 //2 legal
byte b = 128//3 illegal
byte b = 27d //4 illegal
byte b = 27f //5 illegal
now life is easy
max value of a byte primitive can be 127.
all of them above are compile-time constants, so the compiler is clever enough to to allocate only 128 bits for the variable in the memory(stack or heap) it dosen't asks us to do a explicit cast, required otherwise.
you can see at line 3,4,5 since the compiler can see that even if allocates 128 bits, its not suffice.
in ur case:
byte c = a + b;//not legal where a and b are byte primitives
byte c = (byte)(a + b); //explicit cast req.
since a and b are not compile-time constants we have to do an explicit cast
well again if u declare a and b as final(actually as constants), then again
u'll see u dont require an explicit cast. As in:
final byte a = 7;
final bute b = 8;
byte c = a + b; //no need to do explicit cast as 'a' and 'b' are now compile-time constants
Reality is something more than meets the eye ;-)
well in case of any doubts feel free to get back
amit