Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.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
C# 将十六进制字符串转换为其等效的BigInteger将对该值求反_C#_Biginteger - Fatal编程技术网

C# 将十六进制字符串转换为其等效的BigInteger将对该值求反

C# 将十六进制字符串转换为其等效的BigInteger将对该值求反,c#,biginteger,C#,Biginteger,我有一个字符串,它表示一个大的十六进制数,我想把它转换成一个整数。但是,当我尝试转换时,等效整数的答案是否定的。代码如下: string hex = "9782E78F1636"; BigInteger b1 = BigInteger.Parse(hex, NumberStyles.AllowHexSpecifier); 如何获得正确的结果?请尝试以下操作: var b1 = BigInteger.Parse("0" + hex, NumberStyles.HexNumber); 请记住,

我有一个字符串,它表示一个大的十六进制数,我想把它转换成一个整数。但是,当我尝试转换时,等效整数的答案是否定的。代码如下:

string hex = "9782E78F1636";

BigInteger b1 = BigInteger.Parse(hex, NumberStyles.AllowHexSpecifier);
如何获得正确的结果?

请尝试以下操作:

var b1 = BigInteger.Parse("0" + hex, NumberStyles.HexNumber);
请记住,您需要在十六进制字符串前加上0。
如果第一个数字在8-F之间,您将得到一个负数。您需要在字符串前加0。当这个数字与
long.Parse一起使用时,如果第一个数字在8-F之间,则使用BigInt可以得到一个负数

string hex = "09782E78F1636";
      BigInteger b1 = BigInteger.Parse(hex,NumberStyles.AllowHexSpecifier);
    Console.WriteLine(b1);

已经很久了,但我觉得我应该解释一下原因:

使用最高有效位(MSB)指示值是正值还是负值

biginger
long
都是有符号整数:如果十六进制字符串中的最高有效数字介于0(
0000
)和7(
0111
)之间,则msb为
0
,数字为正。如果是8(
1000
)或更高,则msb为
1
,数字为负数

long.Parse
知道要解析的类型的大小,即它的十六进制表示形式是
0000978E78F1636
。msb是
0
,因此它是非常正的


BigInt
不像long那样大小固定。如果你给它
9782E78F1636
它不知道你的意思与
00001782E78F1636
相同。它认为这种类型只是比较短。它期望一个有符号的值,它认为您的意思是9(
1001
)的第一位是符号。在前面的
09782E78F1636
中添加一个零可以清楚地表明MSL位是
0
,而
1001
只是实际值的一部分。

您的前导字符介于8和F之间,这意味着作为有符号数字,它是负数。这对于BigInteger并不特殊,它适用于所有整数类型。这是它们在二进制中表示负数的方式;使用最高有效位

对于大多数类型,MSB的位置取决于类型的大小,前提是使用所有位。如果第一个字符介于8和F之间,则会得到一个负数

        string b = "91";
        SByte b1 = SByte.Parse(b, System.Globalization.NumberStyles.AllowHexSpecifier);
        Console.WriteLine("{0}={1}", b, b1);

        string s = "9123";
        Int16 s1 = Int16.Parse(s, System.Globalization.NumberStyles.AllowHexSpecifier);
        Console.WriteLine("{0}={1}", s, s1);

        string i = "91234567";
        Int32 i1 = Int32.Parse(i, System.Globalization.NumberStyles.AllowHexSpecifier);
        Console.WriteLine("{0}={1}", i, i1);

        string l = "9123456789012345";
        Int64 l1 = Int64.Parse(l, System.Globalization.NumberStyles.AllowHexSpecifier);
        Console.WriteLine("{0}={1}", l, l1);
BigInteger不一定很大,它的大小是任意的,它将使用足够的字节来匹配给定的数字,因此要填充它的字节并设置MSB,使其为负数,它只是遇到的第一个字符。如果您的数字未签名,则需要在字符串开头添加0

        string big = "91";
        BigInteger big1 = BigInteger.Parse(big, System.Globalization.NumberStyles.AllowHexSpecifier);
        Console.WriteLine("{0}={1}", big, big1);

可以肯定吗
numberstyle.HexNumber
返回为
-114886490253770
。你认为你将如何成为一个积极的人?你的预期输出是什么?为什么?@SonerGönül,问题很清楚:预期结果是正数,因为指定的十六进制数是正数。如果第一个数字在8-F之间,
biginger.Parse
将返回一个负数,这是一个缺乏文档证明且不明显的方法行为。@DavidArno它的第一个字符是9,因此如果它是有符号整数,我希望它是负数。是的,我这样做了。var str=b1.ToString();为什么要切换到
NumberStyles.HexNumber
?这里不需要这样做,因为只有当要解析的字符串包含空格时才需要这样做