我正在尝试将字节数组转换为整数:
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
。这有什么问题?
答案 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