入力が「FF」の場合、文字列表現は 1 バイトの 16 進数になります。
これを short (2 バイト) に割り当てようとすると、変換された数値に符号を適用するために最後のビットが考慮されないため、255 の値が得られます。
代わりに、「FFFF」の文字列表現は 2 バイトを表し、最後のビットが 1 に設定されているため、Int16 のような符号付きの型に割り当てられた場合、結果は負になり、ushort のような符号なしの型に割り当てられた場合、65535 になります。
string number = "0xFFFF";
short n = Convert.ToInt16(number, 16);
ushort u = Convert.ToUInt16(number, 16);
Console.WriteLine(n);
Console.WriteLine(u);
number = "0xFF";
byte b = Convert.ToByte(number, 16);
short x = Convert.ToInt16(number, 16);
ushort z = Convert.ToUInt16(number, 16);
Console.WriteLine(n);
Console.WriteLine(x);
Console.WriteLine(z);
出力:
-1
65535
-1
255
255