QByteArray到整数转换会产生不正确的结果

时间:2016-11-20 17:46:24

标签: c++ qt5 qbytearray

我正在尝试将字节数组转换为整数:

using UnityEngine;
using System.Collections;

public class Scoremanager : MonoBehaviour {
    public static Scoremanager instance;
    public int Score;
    void Awake(){
        if (instance == null) {
            instance = this;
        }

    }
    // Use this for initialization
    void Start () {
        Score = 0;
        PlayerPrefs.SetInt ("Score", 0);
    }

    // Update is called once per frame
    void Update () {

    }
     public void IncrementScore(){
        Score++;

    }
    public void StopScore(){
        PlayerPrefs.SetInt ("HighScore", Score);
        if(PlayerPrefs.HasKey("HighScore")){

            if (Score > PlayerPrefs.GetInt ("HighScore")) {
                PlayerPrefs.SetInt ("HighScore", Score);

            }
        }
        else{
            PlayerPrefs.SetInt ("HighScore", Score);
    }
}

但我得到QByteArray b = QByteArray::fromHex("00008000"); quint32 result = b[3]; result += b[2] << 8; result += b[1] << 16; result += b[0] << 24; 而不是4294934528。这有什么问题?

1 个答案:

答案 0 :(得分:1)

QByteArray是一个char的数组。显然,您平台上的char已签名且为8位宽。因此,您的问题可以归结为:

char c = 0x80;
quint32 = c << 8;

标准要求:

  

N4606§4.8[conv.integral] / 3

     

如果目标类型已签名,则值可以保持不变   以目的地类型表示;否则,价值是   实现定义的。

在这种情况下(通常在2的补码系统上),0x80被映射到std::numeric_limits<char>::min() == -128,这只是合乎逻辑的,因为它们共享相同的基础位模式。 / p>

现在,-128 << 8定义为-128 * 2 8 ,即-32768。

最后,明确定义了从-32768到32位无符号整数的转换,并产生4294934528