long/int到UINT64的转换,并在C#上返回long-何时可以丢失数据

本文关键字:long- 返回 何时可 数据 并在 int UINT64 转换 long | 更新日期: 2023-09-27 18:28:17

我有C++服务器,它将数据发送到C#客户端。服务器从数据库中读取一些值。它有一个解析器,用于序列化要通过网络发送的数据,该网络只能发送无符号数字,例如uint64

但在数据库中,我相信它发送给我的一个值的类型是int/long。所以从数据库中读取后,它可能会将其转换为uint64

在C#方面,我使用这个数字进行以下操作

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

其中余额为类型CCD_ 4。但C#上的Get_QWORD返回ulong——正如我所说,解析器只适用于无符号数字。

那么,在什么情况下我可以丢失上面的数据否则我会一直收到服务器发送给我的数据?(即使是负整数?)


基本上流程是这样的,我想

int/long-->由服务器转换/转换为uint64-->通过网络发送-->解析为ulong-->转换为long(如我在代码中所示)

long/int到UINT64的转换,并在C#上返回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,必须将其强制转换为相同大小的类型,即int

但正如您所看到的,这仍然假设您的C++代码中有一定大小的long(如果您只针对Windows,这是可以的)。如果您可以访问C++代码,最好将long<cstdint>更改为固定大小的类型(如uint64_t),并像以前一样在C#端将其强制转换为long