b é byte, b1 é byte, mas o resultado da multiplicação é um int.
De modo geral:
O resultado da multiplicação de byte, char, short ou int por outro byte, char, short ou int é um int.
O resultado da multiplicação de um long por um byte, char, short ou int é um long.
O resultado da multiplicação de um double ou float por qualquer outra coisa é um double.
Fox_McCloud
1 bit = dado que ocupa 1 posição de memória (0 ou 1)
1 byte = 8 bits
1 byte * 1 byte = alguma coisa que ocupa entre 1 e 16 bits (entre 1 e 2 bytes), e que portanto não cabe mais em um byte, por isso o Java retorna automaticamente um int.
Quando você faz um casting assim:
byteb=(byte)(b1*b2);
Está jogando fora todos os dados menos significativos além dos oito bits (byte), ou seja, perdendo precisão. Se você quiser precisão total, isso é um erro.
Perda de precisão é admissível, desde que você o faça intencionalmente e sabendo o porquê.