1

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

有符号:-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;
}
4

3 回答 3

7

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

if(x > 32767) {x = x - 65536;}
于 2013-03-13T17:14:37.990 回答
2

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

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

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

As a side note the reason the first solution works is because if you bit shift to the right 16 times, the most significant bit of your 16 bit number will actually become the most significant bit of the 32 bit JavaScript integer (so if the most significant bit was a 1, it'd make the number negative), and so when you shift it to the left 16 times it'd shift while keeping the standard 2s complement form and retain the value/sign it gained from being shifted to the right previously, see this Wikipedia article for more:
https://en.m.wikipedia.org/wiki/Arithmetic_shift

于 2020-06-17T01:38:44.020 回答
0

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

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

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

于 2020-03-25T10:03:10.063 回答