當 int 變數超過 10 位時,會發生錯誤,并且數字變為負數。
為什么會發生這種情況,我該如何解決這個問題?
這是我的代碼:
UnityWebRequest www = new UnityWebRequest("https://api.hypixel.net/skyblock/bazaar");
www.downloadHandler = new DownloadHandlerBuffer();
yield return www.SendWebRequest();
JSONNode itemsData = JSON.Parse(www.downloadHandler.text);
unixtimeOnline = itemsData2["lastUpdated"];
Debug.Log(unixtimeOnline);
// output -2147483648
uj5u.com熱心網友回復:
tl;博士
只需使用ulong而不是intforunixtimeOnline
ulong unixtimeOnline = itemsData2["lastUpdated"];
發生了什么?
正如已經提到的int(或也System.Int32)有32位。
int.MaxValue是_
2147483647
沒有int比這更高的了。你得到的基本上是一個位元組溢位。
從JSON.Parse我懷疑你正在使用SimpleJson
如果你有
int unixtimeOnline = itemsData2["lastUpdated"];
它將隱式使用
public static implicit operator int(JSONNode d) { return (d == null) ? 0 : d.AsInt; }
哪個使用AsInt
public virtual int AsInt { get { return (int)AsDouble; } set { AsDouble = value; } }
這是一個問題,因為 adouble可以承受
所以當你只是做
double d = 2147483648.0;
int example = (int)d;
你會再次得到
-2147483648
你想要什么
您想使用支持更大數字的型別。像例如
long: 上升到9,223,372,036,854,775,807并且實際上是系統時間刻度通常存盤為(參見例如
DateTime.Ticks
或者實際上因為你的時間可能永遠不會是負數,所以直接使用未簽名的
ulong: 上升到18,446,744,073,709,551,615
解決方案
長存盤短:其他數值有隱式轉換,所以你需要做的就是使用
ulong unixtimeOnline = itemsData2["lastUpdated"];
它會AsUlong改為使用
public static implicit operator ulong(JSONNode d) { return (d == null) ? 0 : d.AsULong; }
現在正確使用
public virtual ulong AsULong { get { ulong val = 0; if (ulong.TryParse(Value, out val)) return val; return 0; } set { Value = value.ToString(); } }
uj5u.com熱心網友回復:
正如評論所說,您將需要使用long變數型別
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/428504.html
