整型数值类型(C# 参考)
整型数值类型 表示整数。 所有的整型数值类型均为值类型。 它们还是简单类型,可以使用文本进行初始化。 所有整型数值类型都支持算术、位逻辑、比较和相等运算符。
整型类型的特征
C# 支持以下预定义整型类型:
C# 类型/关键字 | 范围 | 大小 | .NET 类型 |
---|---|---|---|
sbyte |
-128 到 127 | 8 位带符号整数 | System.SByte |
byte |
0 到 255 | 无符号的 8 位整数 | System.Byte |
short |
-32,768 到 32,767 | 有符号 16 位整数 | System.Int16 |
ushort |
0 到 65,535 | 无符号 16 位整数 | System.UInt16 |
int |
-2,147,483,648 到 2,147,483,647 | 带符号的 32 位整数 | System.Int32 |
uint |
0 到 4,294,967,295 | 无符号的 32 位整数 | System.UInt32 |
long |
-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 | 64 位带符号整数 | System.Int64 |
ulong |
0 到 18,446,744,073,709,551,615 | 无符号 64 位整数 | System.UInt64 |
nint |
取决于(在运行时计算的)平台 | 带符号的 32 位或 64 位整数 | System.IntPtr |
nuint |
取决于(在运行时计算的)平台 | 无符号的 32 位或 64 位整数 | System.UIntPtr |
在除最后两行之外的所有表行中,最左侧列中的每个 C# 类型关键字都是相应 .NET 类型的别名。 关键字和 .NET 类型名称是可互换的。 例如,以下声明声明了相同类型的变量:
int a = 123;
System.Int32 b = 123;
表的最后两行中的 nint
和 nuint
类型是本机大小的整数。 从 C# 9.0 起,可以使用 nint
和 nuint
关键字定义本机大小的整数。 在 32 位进程中运行时有 32 位的整数,在 64 位进程中运行时有 64 位的整数。 这些类型可用于互操作方案、低级别的库,可用于在广泛使用整数运算的方案中提高性能。
本机大小的整数类型在内部表示为 .NET 类型 System.IntPtr 和 System.UIntPtr。 从 C# 11 开始,nint
和 nuint
类型是基础类型的别名。
每个整型类型的默认值都为零 0
。
每个整型类型都有 MinValue
和 MaxValue
属性,提供该类型的最小值和最大值。 这些属性是编译时常量,但本机大小类型(nint
和 nuint
)的情况除外。 对于本地大小的类型,MinValue
和 MaxValue
属性是在运行时计算的。 这些类型的大小取决于进程设置。
System.Numerics.BigInteger 结构用于表示没有上限或下限的带符号整数。
整数文本
整数文本可以是
- 十进制:不使用任何前缀
- 十六进制:使用
0x
或0X
前缀 - 二进制:使用
0b
或0B
前缀
下面的代码演示每种类型的示例:
var decimalLiteral = 42;
var hexLiteral = 0x2A;
var binaryLiteral = 0b_0010_1010;
前面的示例还演示了如何将 _
用作数字分隔符。 可以将数字分隔符用于所有类型的数字文本。
整数文本的类型由其后缀确定,如下所示:
如果文本没有后缀,则其类型为以下类型中可表示其值的第一个类型:
int
、uint
、long
、ulong
。注意
文本解释为正值。 例如,文本
0xFF_FF_FF_FF
表示uint
类型的数字4294967295
,但其位表现形式与int
类型的数字-1
相同。 如果需要特定类型的值,请将文本强制转换为该类型。 如果文本值无法以目标类型表示,请使用运算符unchecked
。 示例:unchecked((int)0xFF_FF_FF_FF)
生成-1
。如果文本以
U
或u
为后缀,则其类型为以下类型中可表示其值的第一个类型:uint
、ulong
。如果文本以
L
或l
为后缀,则其类型为以下类型中可表示其值的第一个类型:long
、ulong
。注意
可以使用小写字母
l
作为后缀。 但是,这会生成一个编译器警告,因为字母l
可能与数字1
混淆。 为清楚起见,请使用L
。如果文本的后缀为
UL
、Ul
、uL
、ul
、LU
、Lu
、lU
或lu
,则其类型为ulong
。
如果由整数字面量所表示的值超出了 UInt64.MaxValue,则将出现编译器错误 CS1021。
如果确定的整数文本的类型为 int
,且文本所表示的值位于目标类型的范围内,则该值可以隐式转换为 sbyte
、byte
、short
、ushort
、uint
、ulong
、nint
或 nuint
:
byte a = 17;
byte b = 300; // CS0031: Constant value '300' cannot be converted to a 'byte'
如前面的示例所示,如果文本的值不在目标类型的范围内,则发生编译器错误 CS0031。
还可以使用强制转换将整数文本所表示的值转换为除确定的文本类型之外的类型:
var signedByte = (sbyte)42;
var longVariable = (long)42;
转换
可以将任何整型数值类型转换为其他整数数值类型。 如果目标类型可以存储源类型的所有值,则转换是隐式的。 否则,需要使用强制转换表达式来执行显式转换。 有关详细信息,请参阅内置数值转换。
本机大小的整数
本机大小的整数类型具有特殊行为,因为存储是由目标计算机上的自然整数大小决定的。
若要在运行时获取本机大小的整数大小,可以使用
sizeof()
。 但是,必须在不安全的上下文中编译代码。 例如:Console.WriteLine($"size of nint = {sizeof(nint)}"); Console.WriteLine($"size of nuint = {sizeof(nuint)}"); // output when run in a 64-bit process //size of nint = 8 //size of nuint = 8 // output when run in a 32-bit process //size of nint = 4 //size of nuint = 4
也可以通过静态 IntPtr.Size 和 UIntPtr.Size 属性获得等效的值。
若要在运行时获取本机大小的整数的最小值和最大值,请将
MinValue
和MaxValue
用作nint
和nuint
关键字的静态属性,如以下示例中所示:Console.WriteLine($"nint.MinValue = {nint.MinValue}"); Console.WriteLine($"nint.MaxValue = {nint.MaxValue}"); Console.WriteLine($"nuint.MinValue = {nuint.MinValue}"); Console.WriteLine($"nuint.MaxValue = {nuint.MaxValue}"); // output when run in a 64-bit process //nint.MinValue = -9223372036854775808 //nint.MaxValue = 9223372036854775807 //nuint.MinValue = 0 //nuint.MaxValue = 18446744073709551615 // output when run in a 32-bit process //nint.MinValue = -2147483648 //nint.MaxValue = 2147483647 //nuint.MinValue = 0 //nuint.MaxValue = 4294967295
可以使用以下范围内的常量值:
- 对于
nint
:Int32.MinValue 到 Int32.MaxValue。 - 对于
nuint
:UInt32.MinValue 到 UInt32.MaxValue。
- 对于
编译器可将这些类型隐式和显式转换为其他数值类型。 有关详细信息,请参阅内置数值转换。
没有适用于本机大小整数文本的直接语法。 没有后缀可表示文本是本机大小整数,例如
L
表示long
。 可以改为使用其他整数值的隐式或显式强制转换。 例如:nint a = 42 nint a = (nint)42;
C# 语言规范
有关更多信息,请参阅 C# 语言规范的以下部分: