long/int到UINT64转换,并在C#上返回到long-何时可以丢失数据? < >我有C++服务器,它把数据发送给C客户端。服务器从数据库中读取一些值。 它有一个解析器,用于序列化通过网络发送的数据,该网络只能发送无符号数字,例如,uint64
但在数据库中,我相信它发送给我的一个值的类型是long/int到UINT64转换,并在C#上返回到long-何时可以丢失数据? < >我有C++服务器,它把数据发送给C客户端。服务器从数据库中读取一些值。 它有一个解析器,用于序列化通过网络发送的数据,该网络只能发送无符号数字,例如,uint64,c#,c++,C#,C++,但在数据库中,我相信它发送给我的一个值的类型是int/long。因此,在从数据库读取后,它可能会将其强制转换为uint64 在C#端,我用这个数字来跟踪 balance = unchecked((long)answer.Find(ModuleGlobals.TAG_TI_BALANCE).Get_QWORD()); 其中余额类型为long。但是在C上获取QWORD返回ulong——正如我所说的,解析器只对无符号数字起作用 那么在什么情况下我会丢失上面的数据呢?或者我最终会得到服务器发送给我的数
int/long
。因此,在从数据库读取后,它可能会将其强制转换为uint64
在C#端,我用这个数字来跟踪
balance = unchecked((long)answer.Find(ModuleGlobals.TAG_TI_BALANCE).Get_QWORD());
其中余额类型为long
。但是在C上获取QWORD返回ulong
——正如我所说的,解析器只对无符号数字起作用
那么在什么情况下我会丢失上面的数据呢?或者我最终会得到服务器发送给我的数据?(即使是负整数?)
我想基本上是这样的
int/long-->由服务器转换/转换为uint64-->通过网络发送-->解析为ulong-->转换为long(如我在代码中所示)需要修改,因为问题已更改
换成
balance = unchecked((int)answer.Find(ModuleGlobals.TAG_TI_BALANCE).Get_QWORD());`
C#
的long
设置为64位<代码>C++的长
各不相同。如果两者大小相同(表示形式相同),则一切正常
但在Windows上,C++的long
是32位的。所以,你会失去负数的符号位。例如,在C++前面发送<代码> -1 < /COD>将给您一个<代码> 0xFFFFFFFF/<代码>。要使0xffffff
再次返回到-1
,必须将其转换为相同的大小类型,即int
但正如你所看到的,在C++代码中,仍然假定有一定大小的<代码>长< /Cord>(如果只针对Windows,这是OK)。如果您有访问C++代码的能力,最好将<代码>长< />代码改为固定大小的类型,如<代码> UTIN 64×T/<代码> >代码> <代码>,并在您的工作时将其转换为
≠ 是的,但是我检查了C++上的UINT64,你确定数据库存储了代码> int <代码> > s和<代码>长< /Cord> s,只发出“代码> UINT64”/代码> S。我被告知它是Oracle数据库中的数字类型,但是没有固定点号存储在那里,像只有1.2个整数。通过网络发送时,它将强制转换为UINT64,因为序列化程序仅支持无符号整数 long