【问题标题】:Javascript unsigned short to signed shortJavascript 无符号短到有符号短
【发布时间】:2011-09-18 11:36:33
【问题描述】:

我有以下代码:

var v = [0xFF, 0xFF];
alert((v[0]<<8) | v[1]);

它会提醒 65535(最大短值)。

如何将此字节数组视为有符号短,并获取此数组的有符号值。

【问题讨论】:

    标签: javascript bytearray


    【解决方案1】:

    假设高位是符号:

    var sign = v[0] & (1 << 7);
    var i = ((v[0] & 0x7F) << 8) | v[1];
    if (sign) {
        i = -i;
    }
    

    http://jsfiddle.net/p4TQw/1/


    如果您使用Two's complement 表示:

    var i = (((v[0] << 8) | v[1]) << 16) >> 16);
    

    16 位左移将所有位向左移动;并且算术 16 位右移在移位时处理符号。 (Javascript 使用 32 位整数进行移位操作。)

    http://jsfiddle.net/p4TQw/3/

    【讨论】:

    • 不应该 [0xFF, 0xFF] 被 -1 签名吗?如果我在 C# 中执行以下代码:Int16 v = -1; byte[] int16LittleEndian = BitConverter.GetBytes(v); Console.WriteLine(BitConverter.ToString(ba)); 我会得到FF-FF 作为回报。与Console.WriteLine( BitConverter.ToInt16(new byte[]{0xFF, 0xFF},0)); 相同,我得到-1;
    • 是的,这取决于您使用的约定。如果使用二进制补码,则为 -1。
    • 二进制补码的更新答案
    猜你喜欢
    • 2011-06-18
    • 1970-01-01
    • 2013-02-16
    • 2016-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多