C#:这段代码可以简化吗?

时间:2018-04-13 02:25:40

标签: c# .net

感觉这段代码可以简化,写下这一切真的很难。我是C#的新手,我不知道它是什么,或者它与之前的开发者已经离开它的等同。

有人可以解释这是什么,以及如何简化它?

Convert.ToInt32(new decimal(new int[] {10, 0, 0, 0})

2 个答案:

答案 0 :(得分:1)

您应该阅读以下内容

Int32 Structure

  

表示 32位有符号整数。

decimal (C# Reference)

  

decimal关键字表示 128位数据类型。与其他相比   浮点类型,十进制类型具有更高的精度和a   较小的范围,这使其适合金融和货币   计算。十进制类型的近似范围和精度   如下表所示。

Decimal Constructor (Int32[])

  

将Decimal的新实例初始化为表示的十进制值   以二进制形式包含在指定数组中。

     

<强>说明

     

十进制数的二进制表示由1位组成   符号,96位整数,以及用于分割的缩放因子   整数,并指定它的小数部分。   缩放因子隐含地为数字10,提升为指数   范围从0到28。

     
      
  • 位是一个四元素长的32位有符号整数数组。

  •   
  • 位[0],位1和位2包含96位整数的低,中,高32位。

  •   

让我们分解你正在做的事情

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