簡體   English   中英

long / int到UINT64的轉換並在C#上返回long-什么時候可以丟失數據?

[英]long/int to UINT64 conversion and back to long on C# - when can I lose data?

我有C ++服務器,它將數據發送給C#客戶端。 服務器從數據庫讀取一些值。 它具有用於序列化要通過網絡發送的數據的解析器,該解析器只能發送無符號數字,例如uint64

但是在數據庫中,我相信它發送給我的一個值是int/long類型。 因此,從數據庫讀取后,可能會將其轉換為uint64

在C#端,我遵循該數字

balance = unchecked((long)answer.Find(ModuleGlobals.TAG_TI_BALANCE).Get_QWORD());

余額類型為long 但Get_QWORD C#的回報ulong -正如我所說分析器只無符號數的作品。

那么在什么情況下我會丟失上述數據? 還是我總是會得到服務器發送給我的數據? (即使是負整數?)


我猜基本上是這樣的

int / long->通過服務器轉換/轉換為uint64->通過網絡發送->解析為ulong->強制轉換為long(如我的代碼所示)

問題發生變化時需要修訂。


更改為

balance = unchecked((int)answer.Find(ModuleGlobals.TAG_TI_BALANCE).Get_QWORD());`

C#long設置為64位。 C++long不一。 如果兩者大小相同(和表示形式相同),則一切正常。

但是在Windows上,C ++的long是32位的。 因此,您將在負數上丟失符號位。 例如,從C ++前端發送-1將在C#中為您提供0xFFFFffff 要使0xFFFFffff重新回到-1 ,必須將其0xFFFFffff轉換為相同的大小類型,即int

但是如您所見,這仍然假設您的C ++代碼中有一定的long大小(如果僅針對Windows,則可以)。 如果可以訪問C ++代碼,則最好將<cstdint> long更改為uint64_t等固定大小的類型,然后像執行操作一樣將其轉換為C#端的long

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM