以数学方式将signed转换为无符号整数

时间:2015-04-23 00:58:38

标签: math integer signed unsigned-integer

我的OPC服务器需要一个无符号的16位整数值,但只能发送一个带符号的16位整数。我需要在数学上将此有符号整数更改为无符号,但我不确定如何。我的互联网研究也没有引导我走上正确的道路。有人可以给一些建议吗?提前谢谢。

1 个答案:

答案 0 :(得分:2)

从数学角度看,从有符号到无符号的转换通过发送有符号整数的非负余数除以1 + max来工作,其中max是您可以使用可用位数写入的最大整数,16你的情况。

对于有符号整数s,此逻辑的工作原理如下:

if s >= 0 then return s else return 1 + max + s

要使此约定按预期工作,签名的s必须满足

- (1 + max)/2 <= s < (1 + max)/2

在您的情况下,假设您有16位,我们有max = 0xFFFF1 + max = 0x10000 = 65536.

另请注意,如果使用此约定编写负整数,则结果将打开其最高位,即等于1.这样,最高位变为一个标志,指示该数字是负数还是正数。

示例:

 2 -> 2
 1 -> 1
 0 -> 0
-1 -> 0xFFFF
-2 -> 0xFFFE
-3 -> 0xFFFD
...
-15 -> 0xFFF1
...
-32768 -> 0x8000 = 32768 (!)
-32769 -> error: cannot codify using only 16 bits.