Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
long/int到UINT64转换,并在C#上返回到long-何时可以丢失数据? < >我有C++服务器,它把数据发送给C客户端。服务器从数据库中读取一些值。 它有一个解析器,用于序列化通过网络发送的数据,该网络只能发送无符号数字,例如,uint64_C#_C++ - Fatal编程技术网

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/<代码> >代码> <代码>,并在您的工作时将其转换为长< />代码。如果没有,那么我认为你不会丢失任何数据。@AustinWBryan它可能会丢失数据,但在发送之前,它会将数据投射到UINT64,这是一个相当脆弱的网络。但是不,这些类型的转换不会改变值的位,只会改变位的解释。唯一的风险因素是字节的顺序,大端与小端。你永远也不会注意到这个问题。@汉斯潘的后缀已经被关注了,但是我不想把C++转换成UINT64——那么在这种情况下会发生什么?@ Windows上的USER(3200)C++编译器将处理<代码>未签名的长< /C> > 32位。因此,为了使一切顺利进行,在两侧使用相同大小的数据类型(C++的

long
≠ 是的,但是我检查了C++上的UINT64,你确定数据库存储了代码> int <代码> > s和<代码>长< /Cord> s,只发出“代码> UINT64”/代码> S。我被告知它是Oracle数据库中的数字类型,但是没有固定点号存储在那里,像只有1.2个整数。通过网络发送时,它将强制转换为UINT64,因为序列化程序仅支持无符号整数