签署无签名和副Versa(算术)

时间:2013-03-13 15:31:43

标签: javascript jquery c

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

签名:-32768到32767 unsigned: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;
}

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

函数签名(位,值){返回值&(1 <<(位-1))吗?值-(1 <<位):值; }

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

signed(16,0xFF); //返回255

答案 2 :(得分:0)

如果您要寻找与按位操作相关的答案,可以尝试以下操作:

  • 将类似于16位无符号整数(即0 <= n <= 65535)的内容转换为16位有符号整数:
(number << 16) >> 16
  • 或者:
new Int16Array([number])[0]

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

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