强制类型转换的疑问,该如何处理

强制类型转换的疑问

byte a = 3;

a =(byte)(a + 2);    //pass
a = a + (byte)2; //unpass
a = (byte)2 + a; //unpass
                a = (byte)2;            //pass


我有个疑问,为什么2和3编译通不过,1和4过了,谁能帮忙解释下,由于这个问题不是太好描述,就没有直接百度搜索了。如果是C语言这样的做法是没问题的。
------解决方案--------------------
因为两个byte相加可能溢出,所以需要强制转换。