整型数值类型(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 类型是本机大小的整数。 从 C# 9.0 起,可以使用 nintnuint 关键字定义本机大小的整数。 在 32 位进程中运行时有 32 位的整数,在 64 位进程中运行时有 64 位的整数。 这些类型可用于互操作方案、低级别的库,可用于在广泛使用整数运算的方案中提高性能。

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

每个整型类型的默认值都为零 0

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

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

整数文本

整数文本可以是

  • 十进制:不使用任何前缀
  • 十六进制:使用 0x0X 前缀
  • 二进制:使用 0b0B 前缀

下面的代码演示每种类型的示例:

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

前面的示例还演示了如何将 _ 用作数字分隔符。 可以将数字分隔符用于所有类型的数字文本。

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

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

    注意

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

  • 如果文本以 Uu 为后缀,则其类型为以下类型中可表示其值的第一个类型:uintulong

  • 如果文本以 Ll 为后缀,则其类型为以下类型中可表示其值的第一个类型:longulong

    注意

    可以使用小写字母 l 作为后缀。 但是,这会生成一个编译器警告,因为字母 l 可能与数字 1 混淆。 为清楚起见,请使用 L

  • 如果文本的后缀为 ULUluLulLULulUlu,则其类型为 ulong

如果由整数字面量所表示的值超出了 UInt64.MaxValue,则将出现编译器错误 CS1021

如果确定的整数文本的类型为 int,且文本所表示的值位于目标类型的范围内,则该值可以隐式转换为 sbytebyteshortushortuintulongnintnuint

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
    
  • 可以使用以下范围内的常量值:

  • 编译器可将这些类型隐式和显式转换为其他数值类型。 有关详细信息,请参阅内置数值转换

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

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

C# 语言规范

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

请参阅