Dlatego, że short ma 16 bitów. Czyli short −32 768 — +32 767 (ze znakiem) lub 0 — +65 535 (bez znaku). Ty masz opcję z znakiem. Ogólnie zaszło takie zjawisko nazywane integer overflow. cpp.sh/2pxbn
0xff00 to jest ogółem 65280 tyle. Ale, short zmieści 32 767. I co zrobi z tym nadmiarem? Zacznie liczyć od "tyłu", czyli od -32768. 65280 - 32 767 = 32513 tyle nam zostaje "reszty", Co z nią dalej zrobi kompilator? Wepchnie do shorta. -32769+32513 = -256. Dlaczego -32769, anie -32768? Dlatego, że -32769 jest liczbą, na której następuję konwersja. -32769 jest równa 32767 w 16 bitowowym zapisie. Wiem, że nie wszystko jest poprawnie semantycznie, ale myślę, że jest przedstawione prosto.