以数学方式将有符号整数转换为无符号整数
Convert signed to unsigned integer mathematically
我的 OPC 服务器需要一个无符号的 16 位整数值,但只能向它发送一个有符号的 16 位整数。我需要在数学上将此有符号整数更改为无符号整数,但不确定如何更改。我的互联网研究也没有引导我走上正确的道路。有人可以给一些建议吗?提前致谢。
从数学上讲,从有符号到无符号的转换过程如下:(1) 将有符号整数除以 1 + max
,(2) 将有符号整数编码为分配。这里 max
是您可以使用可用位数写入的最大整数,在您的情况下为 16。
回想一下,非负余数是唯一满足
的整数r
1. s = q(1+max) + r
2. 0 <= r < 1+max.
请注意,当 s >= 0
时,非负余数是 s
本身(您不能对大于 max
的整数进行编码)。因此,实际上只有在 s < 0
:
时才有事情可做
if s >= 0 then return s else return 1 + max + s
因为值r = 1 + max + s
满足上述非负提醒的条件1和2。
要使此约定按预期工作,已签名的 s
必须满足
- (1 + max)/2 <= s < (1 + max)/2
在你的情况下,假设你有 16 位,我们有 max = 0xFFFF
和 1 + 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.
我的 OPC 服务器需要一个无符号的 16 位整数值,但只能向它发送一个有符号的 16 位整数。我需要在数学上将此有符号整数更改为无符号整数,但不确定如何更改。我的互联网研究也没有引导我走上正确的道路。有人可以给一些建议吗?提前致谢。
从数学上讲,从有符号到无符号的转换过程如下:(1) 将有符号整数除以 1 + max
,(2) 将有符号整数编码为分配。这里 max
是您可以使用可用位数写入的最大整数,在您的情况下为 16。
回想一下,非负余数是唯一满足
的整数r
1. s = q(1+max) + r
2. 0 <= r < 1+max.
请注意,当 s >= 0
时,非负余数是 s
本身(您不能对大于 max
的整数进行编码)。因此,实际上只有在 s < 0
:
if s >= 0 then return s else return 1 + max + s
因为值r = 1 + max + s
满足上述非负提醒的条件1和2。
要使此约定按预期工作,已签名的 s
必须满足
- (1 + max)/2 <= s < (1 + max)/2
在你的情况下,假设你有 16 位,我们有 max = 0xFFFF
和 1 + 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.