2012-01-22 21 views
2

我有例如以下字符串:“0x780000105d0e0030” 如果这不是字符串,我可以轻松地获得价值如下:转换小数

ulong myValue = 0x780000105d0e0030; 

这给我的价值:8646911354832027696 然而,当我想它解析如下:

var myValue2= Convert.ToInt64("0x780000105d0e0030",16) 

这给我的价值:8070450566607667200

然后,再将myvalue的是不同于myValue2。 myValue是正确的,但它应该如何工作。我究竟做错了什么?

回答

3

Int64签署的long

使用Convert.ToUInt64代替:

var myValue2= Convert.ToUInt64("0x780000105d0e0030",16); 
+0

True ..原始代码导致溢出。 –

3

myValue是无符号的Int64,myValue2是有符号的Int64。

你实际需要的是Convert.ToUInt64函数。

+0

现在我只是醒了,所以我只有90%肯定这一点,但7是0111所以第一位实际上是零,所以它应该表示相同的数字作为有符号或无符号。 – harold

+0

你是对的。我从我的答案中删除了该部分。 – pad

+0

对,但是如何解释差异呢?显然这种类型是错误的,但是在这种特殊情况下,该值应该是相同的。 – harold

2

要转换的值是Int64类型的范围内,并且被转换为等效的Int64值,如可通过下面的代码来证明:

ulong u = 0x780000105d0e0030; 

Console.WriteLine("Convert.ToInt64(\"0x780000105d0e0030\", 16) => {0}", Convert.ToInt64("0x780000105d0e0030", 16)); 
Console.WriteLine("u           => {0}", u); 
Console.WriteLine("u.ToString(\"x\")       => {0}", u.ToString("x")); 
Console.WriteLine("Convert.ToInt64(u.ToString(\"x\"), 16)  => {0}", Convert.ToInt64(u.ToString("x"), 16)); 
Console.WriteLine("u = (ulong)Convert.ToInt64(\"0x780000105d0e0030\", 16)"); 
u = (ulong)Convert.ToInt64("0x780000105d0e0030", 16); 
Console.WriteLine("u           => {0}", u); 

导致下面的输出:

Convert.ToInt64("0x780000105d0e0030", 16) => 8646911354832027696 
u           => 8646911354832027696 
u.ToString("x")       => 780000105d0e0030 
Convert.ToInt64(u.ToString("x"), 16)  => 8646911354832027696 
u = (ulong)Convert.ToInt64("0x780000105d0e0030", 16) 
u           => 8646911354832027696 

哪个乐鸟纲两种可能性:

  1. .NET您正在使用的版本(我有4.0.30319 RTMRel)在Convert.ToInt64实施的一大缺陷
  2. 您正在传递字符串“0x7000000000000000”改为功能。

我的钱会在后面的解释。