感觉这段代码可以简化,写下这一切真的很难。我是C#的新手,我不知道它是什么,或者它与之前的开发者已经离开它的等同。
有人可以解释这是什么,以及如何简化它?
Convert.ToInt32(new decimal(new int[] {10, 0, 0, 0})
答案 0 :(得分:1)
您应该阅读以下内容
表示 32位有符号整数。
decimal关键字表示 128位数据类型。与其他相比 浮点类型,十进制类型具有更高的精度和a 较小的范围,这使其适合金融和货币 计算。十进制类型的近似范围和精度 如下表所示。
将Decimal的新实例初始化为表示的十进制值 以二进制形式包含在指定数组中。
<强>说明强>
十进制数的二进制表示由1位组成 符号,96位整数,以及用于分割的缩放因子 整数,并指定它的小数部分。 缩放因子隐含地为数字10,提升为指数 范围从0到28。
让我们分解你正在做的事情
array = new int[] {10, 0, 0, 0}
数组构造函数允许您在3个 32位值和一些标志中构建十进制, 128位值。这实际上非常深入,但就int而言,数组中的第一个元素表示十进制值的第一个 32位。
例如
Console.WriteLine(new decimal(new int[] {1, 0, 0, 0}) );
Console.WriteLine(new decimal(new int[] {10, 0, 0, 0}) );
Console.WriteLine(new decimal(new int[] {100, 0, 0, 0}) );
Console.WriteLine(new decimal(new int[] {-1, 0, 0, 0}) );
Console.WriteLine(new decimal(new int[] {-10, 0, 0, 0}) );
Console.WriteLine(new decimal(new int[] {-100, 0, 0, 0}) );
Console.WriteLine(new decimal(new int[] {int.MaxValue, 0, 0, 0}) );
Console.WriteLine(new decimal(new int[] {-int.MaxValue, 0, 0, 0}) );
<强>输出强>
1
10
100
4294967295
4294967286
4294967196
2147483647
2147483649
但刚刚发生了什么!甚至整数都不会改变您的想法。您必须将它们视为未签名,然后将它们转换为签名。
I.e
Console.WriteLine((int)Convert.ToUInt32(new decimal(new int[] {1, 0, 0, 0})));
Console.WriteLine((int)Convert.ToUInt32(new decimal(new int[] {10, 0, 0, 0}) ));
Console.WriteLine((int)Convert.ToUInt32(new decimal(new int[] {100, 0, 0, 0}) ));
Console.WriteLine((int)Convert.ToUInt32(new decimal(new int[] {-1, 0, 0, 0}) ));
Console.WriteLine((int)Convert.ToUInt32(new decimal(new int[] {-10, 0, 0, 0}) ));
Console.WriteLine((int)Convert.ToUInt32(new decimal(new int[] {-100, 0, 0, 0}) ));
Console.WriteLine((int)Convert.ToUInt32(new decimal(new int[] {int.MaxValue, 0, 0, 0}) ));
Console.WriteLine((int)Convert.ToUInt32(new decimal(new int[] {-int.MaxValue, 0, 0, 0}) ));
<强>输出强>
1
10
100
-1
-10
-100
2147483647
-2147483647
虽然确实如此,但是你正在建立一个 128位十进制(按比特),但你想把它重新压缩到一个带符号的 32位价值,即Int32
......
您希望得到的最大值是 32位数字,期间。
那么这里的小数点是什么?不是很多(所有其他比特都毫无价值,实际上可能会让你陷入更多麻烦。
我的直觉是你只想创建一个int
...如果你想要一个int
( 32位号码),为什么不创建一个来开始与...
int = 1;
int = -1;
int = int.MaxValue;
答案 1 :(得分:0)
非常有趣的方式来表示int
的{{1}}值。这看起来像是一些位操作代码的一部分。如果您查看10
的构造函数,它会解释此代码的作用。
Decimal
有一个构造函数,它接受Decimal
个数组。前三个数字代表int
的96位的低位,中位和高位。数组中的第四个元素是带有缩放因子的符号位。
我认为这就是它在内部所做的事情。创建一个表示前3位的二进制数,然后将其转换为十进制数。
Decimal
这是一个小提琴:https://dotnetfiddle.net/NDcUvU
https://msdn.microsoft.com/en-us/library/t1de0ya1(v=vs.110).aspx