培训
.NET 中的数字
.NET 提供了一系列数值整数和浮点基元,还提供:
- System.Half,表示半精度浮点数。
- System.Decimal,表示十进制浮点数。
- System.Numerics.BigInteger,它表示没有理论上的上限或下限的整型类型。
- System.Numerics.Complex,它表示复数。
- System.Numerics 命名空间中一组启用了 SIMD 的类型。
.NET 支持带符号和无符号的 8 位、16 位、32 位和 64 位和 128 位整数类型,如下表所示。
带符号整数类型
类型 | 大小(以字节为单位) | 最小值 | 最大值 |
---|---|---|---|
System.Int16 | 2 | -32,768 | 32,767 |
System.Int32 | 4 | -2,147,483,648 | 2,147,483,647 |
System.Int64 | 8 | -9,223,372,036,854,775,808 | 9,223,372,036,854,775,807 |
System.Int128 | 16 | −170,141,183,460,469,231,731,687,303,715,884,105,728 | 170,141,183,460,469,231,731,687,303,715,884,105,727 |
System.SByte | 1 | -128 | 127 |
System.IntPtr(32 位进程中) | 4 | -2,147,483,648 | 2,147,483,647 |
System.IntPtr(64 位进程中) | 8 | -9,223,372,036,854,775,808 | 9,223,372,036,854,775,807 |
无符号整数类型
类型 | 大小(以字节为单位) | 最小值 | 最大值 |
---|---|---|---|
System.Byte | 1 | 0 | 255 |
System.UInt16 | 2 | 0 | 65,535 |
System.UInt32 | 4 | 0 | 4,294,967,295 |
System.UInt64 | 8 | 0 | 18,446,744,073,709,551,615 |
System.UInt128 | 16 | 0 | 340,282,366,920,938,463,463,374,607,431,768,211,455 |
System.UIntPtr(32 位进程中) | 4 | 0 | 4,294,967,295 |
System.UIntPtr(64 位进程中) | 8 | 0 | 18,446,744,073,709,551,615 |
每个整数类型都支持一组标准算术运算符。 System.Math 类为更广泛的数学函数集提供方法。
还可以使用 System.BitConverter 类对整数值中的单个位进行运算。
备注
无符号整数类型不符合 CLS。 有关详细信息,请参阅语言独立性和与语言无关的组件。
System.Numerics.BigInteger 结构是不可变类型,表示其值没有理论上限或下限的任意大型整数。 BigInteger 类型的方法几乎与其他整数类型的方法一致。
.NET 包含以下浮点类型:
类型 | 大小(以字节为单位) | 大致范围 | 基元? | 说明 |
---|---|---|---|---|
System.Half | 2 | ±65504 | 否 | 已在 .NET 5 中引入 |
System.Single | 4 | ±3.4 x 1038 | 是 | |
System.Double | 8 | ±1.7 × 10308 | 是 | |
System.Decimal | 16 | ±7.9228 x 1028 | 否 |
Half、Single 和 Double 类型都支持表示非数字和无穷大的特殊值。 例如,Double 类型提供以下值:Double.NaN、Double.NegativeInfinity 和 Double.PositiveInfinity。 可以使用 Double.IsNaN、Double.IsInfinity、Double.IsPositiveInfinity 和 Double.IsNegativeInfinity 方法来测试这些特殊值。
每个浮点类型都支持一组标准的算术运算符。 System.Math 类为更广泛的数学函数集提供方法。 .NET Core 2.0 及更高版本包含 System.MathF 类,该类提供接受 Single 类型的参数的方法。
还可以使用 System.BitConverter 类对 Double、Single 和 Half 值中的单个位进行运算。 System.Decimal 结构具有自己处理十进制值单个位的方法(Decimal.GetBits 和 Decimal(Int32[]))以及一套执行其他数学运算的方法。
Double、Single 和 Half 类型旨在用于本质上不精确的值(例如两颗行星之间的距离)和无需高度精确和舍入误差小的应用程序。 在需要较高准确度和尽量减小舍入误差的情况下,使用 System.Decimal 类型。
备注
Decimal 类型不会消除对舍入的要求。 相反,它最大限度地减少了因舍入而导致的错误。
System.Numerics.Complex 结构表示复数,即带实数部分和虚数部分的数字。 此类型支持一套标准的算术、比较、相等、显式和隐式转换运算符,以及数学、代数和三角方法。
System.Numerics 命名空间包含一组启用了 .NET SIMD 的类型。 SIMD (Single Instruction Multiple Data) 操作可以在硬件级别并行化。 这可以增加向量化计算的吞吐量,这在数学、科学和图形应用中很常见。
启用了 .NET SIMD 的类型如下:
Plane 类型,表示三维空间中的一个平面。
Quaternion 类型,表示一个用于对三维物理旋转进行编码的向量。
Vector<T> 类型,表示指定数字类型的向量,并提供受益于 SIMD 支持的一组广泛的运算符。 Vector<T> 实例的计数是固定的,但其值 Vector<T>.Count 取决于执行代码的计算机的 CPU。
备注
Vector<T> 类型随 .NET Core 和 .NET 5+ 一起提供,但 .NET Framework 中不提供。 如果你使用的是 .NET Framework,请安装 System.Numerics.Vectors NuGet 包来访问此类型。
启用了 SIMD 的类型以这样一种方式实现:即它们可以与未启用 SIMD 的硬件或 JIT 编译器一起使用。 要利用 SIMD 指令,你的 64 位应用必须由使用 RyuJIT 编译器的运行时运行,该编译器包含在 .NET Core 和 .NET Framework 4.6 及更高版本中。 它针对 64 位处理器增加了 SIMD 支持。
有关详细信息,请参阅使用 SIMD 加速数值类型。