dans ton exemple, l a quel type ? int ? le comportement que tu décris ne me semble pas correspondre à la doc...
en effet d'après ce que je comprends de la doc... supposons que truc a le type blibli et machin le type blublu, alors ils disent que :
(blabla) truc = machin
est défini comme équivalent à :
(blabla) (truc = (blibli) ((blabla) machin))
mais il me semble qu'à partir du moment où on affecte à une variable de type blibli il y a un cast implicite non¹ ? (c'est peut-être là que je me trompe...)
donc que c'est équivalent à : (blabla) (truc = (blabla) machin) tout simplement, lequel, du point de vue des effets de bord, est équivalent à truc = (blabla) machin (le fait que le résultat de l'affectation soit recasté ne change quelque chose que si tu utilises ce résultat...)
Pour revenir à ton exemple, ils disent bien « converting the right-hand side first to the specified type », donc le l devrait d'abord être converti en char quoi qu'il arrive... ça correspond pas

(mais tu compiles en -O0 ? parce que sinon il peut avoir simplifié... par exemple il sait très bien au moment de la compilation que -1 sur 16 bits c'est pareil que -1 sur 8 bits puis une extension...)
¹c'est-à-dire que si j'écris truc = machin et que truc est de type blibli c'est équivalent à truc = (blibli) machin, non ? (sauf que j'aurai peut-être un warning dans le premier cas... bon effectivement ça fait déjà une différence ^^)