Port numbers are 16 bits integers, yes. Unsigned, yes in theory.
But from the computer's perspective it does not really matter whether an N-bits integer is signed or unsigned, until the value is read; what matters is the binary representation of it, and the same representation may encode two different numbers depending on the value of the Most Significant Bit. That's known as the
Two's complement.
Here, the same 16 bits binary blob, let's call it B is read twice: once by the networking apparatus of the client and the server, which read it as unsigned:
unsigned(B) = 32768 + signed(B) = 32768 - 9144 = 23624; and a second time by the application which wrote the player's userinfo; and this one read it as signed, probably because the programmer felt too lazy to type the "unsigned" keyword.
It does not really matter because if you read this signed number and stored it in a 16bits int, signed or unsigned, you'd get the same binary representation anyway. And this applies even if you are out of signed bounds. Signed range for 16bits is −32768 to 32767 (total 65536 distinct values, of course); but if you read a bigger unsigned value, 32768 for instance, it will just wrap around and become −32768, which has the same binary representation.
Hope that served to clear things for you, and not muddle them further