关键字(别名) | 范围 | 进程类型 | 大小 | 符号 | .NET 类型 |
---|---|---|---|---|---|
byte | 0 ~ 255 | 8 位 | 无 | System.Byte | |
sbyte | -128 ~ 127 | 8 位 | 有 | System.SByte | |
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 | 同 int | 32 位 | 32 位 | 有 | System.IntPtr |
nint | 同 long | 64 位 | 64 位 | 有 | System.IntPtr |
nuint | 同 uint | 32 位 | 32 位 | 无 | System.UIntPtr |
nuint | 同 ulong | 64 位 | 64 位 | 无 | System.UIntPtr |
整型数
有符号的 sbyte 和无符号的其他整型数均不被 CLR 支持。既然是定点数,小数点位置是固定的(在表示该数的最后一个字节的最后一位的后面,其实没有……)。意即,有符号整数表示该数的字节除了第一个字节的第一位表示该数的符号(0 为正,1 为负)之外其余位均表示该数的值;无符号整数则每一位都是该数的值位。
声明
用别名或 .NET 类型声明变量作用相同(可以互换):
int z = 123;
System . Int32 z1 = 1;
上面的代码均声明了两个 int(或 System.Int32)类型的变量。
若不赋值,每个定点数的默认值都是 0。
特殊声明
上例使用了文本方式直接赋值给变量。例如 z == 123。也可以在文本前使用前缀 0x 或 0X 表明整数值是十六进制的;或者使用前缀 0b 或者 0B 表明整数值是二进制的。
int z = 0X123;
System . Int32 z2 = 0B10;
int z42 = 0B_0010_1010;
此时,z == 291(十进制),z2 == 2(十进制),z42 == 42(十进制)。z42 的赋值方式使用了“ _ ”作为数字分隔符。
后缀
整数文本的类型由后缀确定:
- 没有后缀。则可以是下列类型:int、uint、long、ulong。若要表示 uint 的 MaxValue(4,294,967,295),由于其与 int 的 -1 二进制表现形式相同,则必须使用 unchecked 确定表示方式是 uint 的最大值还是 int 的 -1。ulong 的 MaxValue 与 long 的 -1 类同。例如:
int zf1 = 0XFF_FF_FF_FF; // CS0266:无法将 uint 显式转换为 int
int zf1 = unchecked((int)0XFF_FF_FF_FF); // 生成 int -1
uint uzMax = 0XFF_FF_FF_FF; // 生成 uint.MaxValue
- 后缀为 U 或 u,可以是 uint、ulong。
- 后缀为 L 或 l,可以是 long、ulong。不推荐使用小写 l,容易与数字 1 混淆。
- 后缀为不区分大小写的 UL、LU,可以是 ulong。
整数文本无法表示大于 ulong . MaxValue 的值,将出现警告 CS1021。也无法表示超出数值范围的数,警告 CS0031;或从范围更大的类型隐式转换为范围更小的类型,警告 CS0266。例如:
ulong cz = 987654321012345678909876543210; // CS1021:整数常量太大
int zL1 = 1L; // CS0266:无法将“long”隐式转换为“int”,存在一个显式转换(是否缺少强制转换?) - 将范围更大的 long 隐式转换为范围更小的 int
int zLi1 = (int)1L; // 无警告 - 强制转换 long 1 为 int 1
long Lz1 = 1; // 无警告 - 将范围更小的 int 转换为范围更大的 long
byte zj = 300; // CS0031:常量值“300”无法转换为“byte” - byte 的 MaxValue 为 255
将范围更大的类型(如 long)转换为范围更小的类型(如 int)必须是强制的,需转换操作,且确保范围大的类型的值能够保存在范围小的类型中,如上例中的 int zLi1 = (int)1L;
;反之,可以是隐式的,无需转换操作,如上例中的 long Lz1 = 1
。
本机整数
本文起始的表格中,最后四个类型为本机整数。包括有符号的 nint 和无符号的 nuint。所谓本机,就是使用该类型的进程。若进程是 32 位的,两个类型与 int 和 uint(System . Int32 和 System . UInt32)相同;若进程是 64 位的,两个类型与 long 和 ulong(System . Int64 和 System . UInt64)相同。
Console . WriteLine ( $"nint 的大小:{nint . Size}" );
Console . WriteLine ( $"unint 的大小:{nuint . Size}" );
若进程是 32 位的,上述代码均显示大小:4;若进程是 64 位的,上述代码均显示大小:8。
其 MaxValue 和 MinValue 均为 int、uint 或 long、ulong 相应的 MaxValue 和 MinValue 值。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。