Joy,
I just want to add on what has been said already. Specifically I want to correct you on this statement and I quote :
----------------------------------------------------------------
1) byte b=123 //this works 123 is an int but you do not need a cast for it to be converted to a byte since 123 is in the range of -127 to 128.
---------------------------------------------------------------
123 is not an int in the snipet above. If it were explicitly defined as an int prior to the assignment, that assignment would not succeed and would raise a Compiler error, even though 123 can fit in a byte. Here is works OK because 123 is used as a literal whose size fits in a byte.
Regds,
Herbert