в
char *b=(char *)&a;
вы получаете адрес a в качестве указателя на символ
b++;*b=2;
установите следующий символ на 2, этот символвнутри a , и эффект зависит от порядка байтов в вашем int , а также от размера int , конечно
printf("%d",a);
Для меня результат также равен 556, потому что начальное значение 300 равно 0x012C, поэтому байты 0x2C 0x01 0x00 0x00 в памяти, если int на 32b, при изменении второго байта на 2 значение изменяется на0x2C 0x02 0x00 0x00 так 0x22c так 556.
В случае, если байты расположены в обратном порядке, начальное значение 300 - это байты 0x00 0x00 0x01 0x2C в памяти (все еще в 32b), при изменении второго байта на 2значение изменяется на 0x00 0x02 0x01 0x2C, поэтому 0x2012c, так 131372