整型数值类型 (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;

表的最后两行中的 nintnuint 类型是本机大小的整数。 可以使用 nintnuint 上下文关键字定义原本大小的整数。 在 32 位进程中运行时,这些是 32 位整数,在 64 位进程中运行时为 64 位整数。 它们可用于互作方案、低级别库,并在广泛使用整数数学的情况下优化性能。

本机大小的整数类型在内部表示为 .NET 类型 System.IntPtrSystem.UIntPtr。 从 C# 11 开始,nintnuint 是其基础类型的别名。

每个整型的默认值为零。 0

每个整型类型都有 MinValueMaxValue 属性,用于提供该类型的最小值和最大值。 这些属性是编译时常量,但本机大小类型(nintnuint)的情况除外。 对于本地大小的类型,MinValueMaxValue 属性是在运行时计算的。 这些类型的大小取决于进程设置。

使用 System.Numerics.BigInteger 结构表示没有上限或下限的带符号整数。

整数文本

整数文本可以是

  • 十进制:不带任何前缀
  • 十六进制:带 0x0X 前缀
  • binary:带有 0b0B 前缀

以下代码演示每个示例:

var decimalLiteral = 42;
var hexLiteral = 0x2A;
var binaryLiteral = 0b_0010_1010;

前面的示例还显示了用作_用法。 可以将数字分隔符与所有类型的数值文本一起使用。

整数文本的类型由其后缀确定,如下所示:

  • 如果文字没有后缀,其类型是在以下类型中第一个可以表示其值的类型:intuintlongulong

    注释

    文本解释为正值。 例如,字面值0xFF_FF_FF_FF表示4294967295类型的数字uint,但它具有与类型-1的数字int相同的位表示形式。 如果需要特定类型的值,请将文本强制转换为该类型。 如果文字值无法在目标类型中表示,请使用unchecked运算符。 示例:unchecked((int)0xFF_FF_FF_FF) 生成 -1

  • 如果文字带有后缀Uu,其类型是以下可以表示其值的类型中的第一个:uintulong

  • 如果文字带有后缀Ll,其类型是以下可以表示其值的类型中的第一个:longulong

    注释

    可以使用小写字母 l 作为后缀。 但是,这会生成编译器警告,因为字母 l 可以与数字 1混淆。 使用 L 以提高清晰度。

  • 如果文本的后缀为 UL、、UluLulLULu、、 lUlu,则其类型为 ulong

如果整数文本表示的值超过 UInt64.MaxValue,则会发生编译器错误 CS1021

如果整数文本int的确定类型并且文本表示的值在目标类型的范围内,则可以将该值隐式转换为sbyte、、byteshortushortuint、或 ulongnintnuint

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.SizeUIntPtr.Size 属性获取等效值。

  • 若要在运行时获取本机字大小的整数的最小值和最大值,应该使用MinValueMaxValue作为静态属性,配合nintnuint关键字,如下例所示:

    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
    
  • 虽然 nintnuint 的完整范围可能更大,但编译时常量仅限于 32 位范围。

  • 编译器提供与其他数值类型的隐式和显式转换。 有关详细信息,请参阅 内置数值转换

  • 没有适用于本机大小整数文本的直接语法。 没有后缀可表示文本是本机大小整数,例如 L 表示 long。 可以改为使用其他整数值的隐式或显式强制转换。 例如:

    nint a = 42
    nint a = (nint)42;
    

C# 语言规范

有关更多信息,请参阅 C# 语言规范的以下部分:

另请参阅