If BITPIX=16 then the values read from the FITS file are signed 16 bit integers. The problem is whether there is an offset applied. In some images there is no offset and so a value of 1024 for the pixel should readout as 1024, it does not, an offset of 16378 is added to it. The offset should only be added if specified in the FITS header (BZERO=13768). If this keyword is not present then no offset should be added.
But, because the FITS file can have negative integers (I agree there shouldn't be any) then it must be carried through to the readout value. I guess when they created the FITS standard they should have stayed with unsigned 16 bit rather than signed integers. I guess they had a reason for it.