【问题标题】:Signed to Unsigned and Vice Versa (arithmetical)签名到未签名和反之亦然(算术)
【发布时间】:2020-06-17 09:44:41
【问题描述】:

如何将数字从无符号转换为有符号?

签名:-32768 到 32767 无符号:0 到 65535

我正在用 JavaScript 解决问题。情况是我有一个数字,例如从 0 到 65535,我想将其转换为合理的有符号值。

例如:65535 应该变成 -1。

请不要使用任何与位相关的运算,而是使用算术运算。

假设我们使用足够大的数据类型,我想这应该与语言无关。

更新: 根据答案进一步实施:

function convertWordToShort(ival) {
    if (isNaN(ival) === false) {
        if (ival > 32767) {
            ival = ival - 65536;
        }
    }
    return ival;
}
function convertShortToWord(ival) {
    if (isNaN(ival) === false) {
        if (ival < 0) {
            ival = ival + 65536;
        }
    }
    return ival;
}
function convertIntToDWord(ival) {
    if (isNaN(ival) === false) {
        if (ival < 0) {
            ival = ival + 4294967296;
        }
    }
    return ival;
}
function convertDWordToInt(ival) {
    if (isNaN(ival) === false) {
        if (ival > 2147483647) {
            ival = ival - 4294967296;
        }
    }
    return ival;
}

【问题讨论】:

  • 我不太明白你的规则,为什么 65535 = -1?
  • 那是因为如果你在 C 编程语言中进行转换,这正是结果。 UInt16 x = 65535;变量 y = (Int16)x; // y = -1
  • 不同的语言有自己的规则来处理这些情况。
  • @Matthias 您的“C”语法非常奇特。 :)
  • 它的 C 但我猜最后有一个 # 。无符号短 x = 65535;短 y = (short)x//y=-1

标签: javascript jquery c


【解决方案1】:

只测试数是否超过一半,然后减去模数。

if(x > 32767) {x = x - 65536;}

【讨论】:

    【解决方案2】:

    如果您要寻找与位运算相关的答案,您可以尝试以下方法:

    • 将类似于 16 位无符号整数(即 0
    (number << 16) >> 16
    
    • 或者:
    new Int16Array([number])[0]
    

    在这两种情况下,数字都是您的 16 位数字。

    作为旁注,第一个解决方案有效的原因是,如果您向右移位 16 次,则 16 位数字的最高有效位实际上将成为 32 位 JavaScript 整数的最高有效位(所以如果最高有效位是 1,它会使数字变为负数),因此当您将其向左移动 16 次时,它会移动,同时保持标准的 2s 补码形式并保留它从移动中获得的值/符号在之前的右侧,请参阅此 Wikipedia 文章了解更多信息:
    https://en.m.wikipedia.org/wiki/Arithmetic_shift

    【讨论】:

      【解决方案3】:

      函数有符号(位,值){返回值&(1

      签名(8, 0xFF); // 返回 -1

      签名(16, 0xFF); // 返回 255

      【讨论】:

      • 请对您的答案提供一些解释,而不仅仅是代码。
      • 这不是答案
      猜你喜欢
      • 2012-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多