【问题标题】:Convert signed to unsigned integer mathematically以数学方式将有符号整数转换为无符号整数
【发布时间】:2015-04-23 00:58:38
【问题描述】:

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

【问题讨论】:

  • 你用什么编程语言来写这段代码?

标签: math integer signed unsigned-integer


【解决方案1】:

从数学上讲,从有符号到无符号的转换如下:(1) 将有符号整数除以1 + max,(2) 将有符号整数编码为除法的非负余数。这里max 是您可以使用可用位数写入的最大整数,在您的情况下为 16。

回想一下,非负余数是唯一满足的整数r

  1. s = q(1+max) + r
  2. 0 <= r < 1+max.

请注意,当s &gt;= 0 时,非负余数是s 本身(不能编码大于max 的整数)。因此,实际上只有当s &lt; 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 = 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.

【讨论】:

  • 第一句有点不清楚:1)“送余数”是什么意思?在数学文献中找不到这个词。 2)“除以1 + max”:它与“非负余数”或“有符号整数”有关吗?请澄清/重新表述。
  • 另外:3)在“这个逻辑的工作原理如下......”公式中,“非负余数”在哪里?
  • @pmor 感谢您的 cmets。如果现在更清楚,请告诉我。
  • 是的,感谢您的修改。但是,文本变得有点长。一些紧凑的例子(每个只有 1 句话!):1)C++ 标准:«如果目标类型是无符号的,则结果值是与源整数一致的最小无符号整数(模 2n,其中 n 是用于表示无符号类型)»。 2)C std:«...如果新类型是无符号的,则通过重复在新类型中可以表示的最大值加或减一的方式转换值,直到该值在新类型的范围内».
  • 3) 书籍:C A Software Engineering Approach:«当整数值 x 转换为较小的无符号整数类型时,结果是 x / (U_MAX+1) 的非负余数,其中 U_MAX 是可以用较短的无符号类型表示的最大数»。 4) DEC C 语言参考手册:«当整数值被降级为较小大小的无符号整数时,结果是该值的非负余数除以比新整数类型的最大可表示无符号值大一的数字» .
猜你喜欢
  • 2012-01-09
  • 2017-07-21
  • 1970-01-01
  • 1970-01-01
  • 2012-08-13
  • 1970-01-01
  • 2012-03-23
  • 2011-06-14
相关资源
最近更新 更多