整型数值类型表示整数数。 所有整型数值类型都是 值类型。 它们也是 简单的类型 ,可以使用 文本进行初始化。 所有整型数值类型都支持 算术、 按位逻辑、 比较和 相等 运算符。
整型类型的特征
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
类型是本机大小的整数。 可以使用 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
前缀 -
binary:带有
0b
或0B
前缀
以下代码演示每个示例:
var decimalLiteral = 42;
var hexLiteral = 0x2A;
var binaryLiteral = 0b_0010_1010;
前面的示例还显示了用作_
的用法。 可以将数字分隔符与所有类型的数值文本一起使用。
整数文本的类型由其后缀确定,如下所示:
如果文字没有后缀,其类型是在以下类型中第一个可以表示其值的类型:
int
、uint
、long
、ulong
。注释
文本解释为正值。 例如,字面值
0xFF_FF_FF_FF
表示4294967295
类型的数字uint
,但它具有与类型-1
的数字int
相同的位表示形式。 如果需要特定类型的值,请将文本强制转换为该类型。 如果文字值无法在目标类型中表示,请使用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
和nuint
的完整范围可能更大,但编译时常量仅限于 32 位范围。- 对于
nint
: 从 Int32.MinValue 到 Int32.MaxValue。 - 对于
nuint
: 从 UInt32.MinValue 到 UInt32.MaxValue。
- 对于
编译器提供与其他数值类型的隐式和显式转换。 有关详细信息,请参阅 内置数值转换。
没有适用于本机大小整数文本的直接语法。 没有后缀可表示文本是本机大小整数,例如
L
表示long
。 可以改为使用其他整数值的隐式或显式强制转换。 例如:nint a = 42 nint a = (nint)42;
C# 语言规范
有关更多信息,请参阅 C# 语言规范的以下部分: