如何在 JavaScript 中将一个字节(8 位)转换为有符号整数?

Ehs*_*adi 5 javascript byte bit

我需要将一个字节转换为java脚本有符号整数。我已经检查过这个转换 2 个字节的链接,但是我如何降级并只转换一个字节?

例如 0x0A 就是 10,那么 0xD4 呢?

And*_*dyT 11

JavaScript 将按位运算符处理为带符号的 32 位整数。

知道这一点后,如果要对字节进行符号扩展,则需要将该字节的最高位(指示符号)传播到 32 位整数中的所有高位。这可以通过以下方式实现:

value << 24 >> 24
Run Code Online (Sandbox Code Playgroud)

其作用是将字节移至 32 位整数的顶部,然后将其向下移回并保留符号位

同样,您可以使用以下方法对 16 位值进行符号扩展:

value << 16 >> 16
Run Code Online (Sandbox Code Playgroud)


小智 5

此解决方案使用 2 的补码来转换负数,这是负数编码的标准方式。

function uncomplement(val, bitwidth) {
    var isnegative = val & (1 << (bitwidth - 1));
    var boundary = (1 << bitwidth);
    var minval = -boundary;
    var mask = boundary - 1;
    return isnegative ? minval + (val & mask) : val;
}
Run Code Online (Sandbox Code Playgroud)

反补(0xFF, 8) 返回-1
反补(0x80, 8) 返回-128
反补(0x7F, 8) 返回127


Ehs*_*adi -3

我想出了这个解决方案:

function convertToSignedInt(signedByte) {
    var sign = signedByte & (1 << 7);
    return (signedByte & 0x7f) * (sign !== 0 ? -1 : 1);
}
Run Code Online (Sandbox Code Playgroud)

希望它可以节省其他人一些时间。ConvertToSignedInt(0x81) // 返回 -1

  • 这是不正确的。值 0x81 代表有符号值 -127。 (2认同)