首页 文章

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

提问于
浏览
1

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

1 回答

  • 1

    从数学角度看,从有符号转换为无符号的转换通过发送有符号整数的非负余数除以 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.
    

相关问题