试试先按数值的位数判断有无符号位
如:
8位数0x7F无符号位(BITAND(0x7F,0x80)!=0x80)
8位数0x81有符号位(BITAND(0x81,0x80)==0x80)
如果无符号位取原数值 0x7F
如果有符号位取 0x81 - (2^8)
程序代码:
? UnsignedToSigned(32767,16)
? UnsignedToSigned(32768,16)
** 无符号整数转有符号整数,nBitSize:8、16、32
FUNCTION UnsignedToSigned(nValue, nBitSize)
IF !INLIST(nBitSize, 8,16,32)
ERROR "无效的位数"
RETURN nValue
ENDIF
LOCAL nMask, nSignBit
nMask = IIF(nBitSize==8,0xFF, IIF(nBitSize==16,0xFFFF, IIF(nBitSize==32,0xFFFFFFFF, 0)))
nSignBit = IIF(nBitSize==8,0x80, IIF(nBitSize==16,0x8000, IIF(nBitSize==32,0x80000000, 0)))
IF !BETWEEN(nValue, 0,nMask)
ERROR TRANSFORM(nValue)+"超出"+TRANSFORM(nBitSize)+"位无符号整数范围"
RETURN nValue
ENDIF
nValue = BITAND(nValue, nMask) && 保留nBitSize位数值
IF BITAND(nValue, nSignBit) == nSignBit && 掩码检查符号位
RETURN nValue - (2^nBitSize) && 有符号
ENDIF
RETURN nValue
ENDFUNC
