C#中的整数类型(非常详细)
C# | .NET 类型 | 长 度 | 值的范围 |
---|---|---|---|
sbyte | System.SByte | 8 | -128 ~ 127 |
byte | System.Byte | 8 | 0 ~ 255 |
short | System.Int16 | 16 | -32,768 ~ 32,767 |
ushort | System.UInt16 | 16 | 0 ~ 65,535 |
int | System.Int32 | 32 | -2,147,483,648 ~ 2,147,483,647 |
uint | System.UInt32 | 32 | 0 ~ 4,294,967,295 |
long | System.Int64 | 64 | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 |
ulong | System.UInt64 | 64 | 0 ~ 18,446,744,073,709,551,615 |
表中长度的单位是位(bit),8 个位等于 1 个字节(byte)。最左侧的字段是 C# 的数据类型,又称 .NET 的别名。例如,整数在 C# 的数据类型是 int,其实在 System 命名空间下,其类名称是 System.Int32。程序设计时用 int 声明变量和用 System.Int32 声明变量,意义是一样的,这个概念可以应用到其他数据字段。
短整数(short)的长度是 16 位,相当于两个字节。整数(int)的长度是 32 位,相当于 4 个字节,可以用下图表示:

声明 int 整数,其语法如下:
int 整形变量;此外,还可以在声明整数时设定整型变量的初始值,其实 C# 语言是鼓励程序设计师在声明变量时同时设定变量的初始值的,当然没有给初始值程序也不会错误。
【实例】整数 int 的声明。
int i = 1; // 声明整数 i = 1 int x, y; // 声明整数x和y但是没有给初始值在上述整数的声明中,如果加上“u”,如 ushort、uint、ulong,则代表此整数一定是正整数。byte 也是正整数。
值得注意的是,由于整数 int 所占内存空间是 32 位,因此,其最大值是 2,147,483,647,如果你有一指令如下:
int x = 2147483647; x = x + 1;那么经上述指令后,x 并不是 2,147,483,648,而是 -2,147,483,648,通常此种情况称为溢位(overflow),所以选择变量时一定要很小心。
【实例】用程序来真正地了解短整数溢位的概念,同时认识到 int 与 System.Int32 概念是相同的。
int x1, x2, x3; x1 = 2147483647; x2 = x1 + 1; x3 = x1 - 1; Console.WriteLine("x1 = " + x1); Console.WriteLine("x2 = " + x2); Console.WriteLine("x3 = " + x3); System.Int32 x4 = 10; Console.WriteLine("x4 = " + x4);执行结果为:
x1 = 2147483647
x2 = -2147483648
x3 = 2147483646
x4 = 10
上述第 8 行使用 .NET 类型定义变量,这和使用 int 声明变量的方法相同。
C#整数类型的属性
表 1 中的每个整数数据类型皆有 MinValue 和 MaxValue 属性,此属性可以显示该整数数据类型的最小值和最大值。【实例】列出整数 int 和长整数 long 的最小值和最大值。
int minx = int.MinValue; int maxx = int.MaxValue; long minlx = long.MinValue; long maxlx = long.MaxValue; Console.WriteLine("int MinValue = " + minx); Console.WriteLine("int MaxValue = " + maxx); Console.WriteLine("long MinValue = " + minlx); Console.WriteLine("long MaxValue = " + maxlx);执行结果为:
int MinValue = -2147483648
int MaxValue = 2147483647
long MinValue = -9223372036854775808
long MaxValue = 9223372036854775807
不同进制的整数
C# 语言的整数除了我们从小所使用的十进制,也有二进制和十六进制,程序设计时十进制和我们的习惯用法并没有太大的差异。下列是二进制系统、十进制系统和十六进制系统的转换表。
十进制系统 | 十六进制系统 | 二进制系统 |
---|---|---|
0 | 0 | 00000000 |
1 | 1 | 00000001 |
2 | 2 | 00000010 |
3 | 3 | 00000011 |
4 | 4 | 00000100 |
5 | 5 | 00000101 |
6 | 6 | 00000110 |
7 | 7 | 00000111 |
8 | 8 | 00001000 |
9 | 9 | 00001001 |
10 | A | 00001010 |
11 | B | 00001011 |
12 | C | 00001100 |
13 | D | 00001101 |
14 | E | 00001110 |
15 | F | 00001111 |
16 | 10 | 00010000 |
十进制是我们熟知的系统,其他进制系统基本概念如下:
- 十六进制系统:数字到达 16 就进一位,所以单一位数是 0~15,其中 10 用 A 表示,11 用 B 表示,12 用 C 表示,13 用 D 表示,14 用 E 表示,15 用 F 表示。
- 二进制系统:数字到达 2 就进一位,所以单一位数是 0~1。
在 C# 语言中,凡是以 0b 或 0B 为开头的整数都被视为二进制数字。例如,说出二进制 0b110001 和 0B1110 的十进制值:
0b110001 等于十进制的49;
0B1110 等于十进制的14;
在 C# 语言中,凡是以 0x 或 0X 开头的整数,皆被视为十六进制整数。例如,说明十六进制0x1A和0x20的10进制值:
0x1A 等于十进制的 26;
0x20 等于十进制的 32;
【实例】分别列出二进制和十六进制值的设定,加总后输出。
int x1 = 0b110001; int x2 = 0B1110; int total; total = x1 + x2; Console.WriteLine($"x1 = {x1}"); Console.WriteLine($"x2 = {x2}"); Console.WriteLine($"Total = {total}"); int y1 = 0x1A; int y2 = 0X20; total = y1 + y2; Console.WriteLine($"y1 = {y1}"); Console.WriteLine($"y2 = {y2}"); Console.WriteLine($"Total = {total}");执行结果为:
x1 = 49
x2 = 14
Total = 63
y1 = 26
y2 = 32
Total = 58
C#千位分隔符
比较长的数字,不易于理解,这时可以使用“_”作为千位分隔符,适度使用千位分隔符可以让表达的数字比较易于理解。【实例】将千位分隔符应用在二进制和十进制数据上。
int x1 = 0b10011_0001; int x2 = 0B10_1110; int total; total = x1 + x2; Console.WriteLine($"x1 = {x1}"); Console.WriteLine($"x2 = {x2}"); Console.WriteLine($"Total = {total}"); int y1 = 1_000_111; int y2 = 5_333_666; total = y1 + y2; Console.WriteLine($"y1 = {y1}"); Console.WriteLine($"y2 = {y2}"); Console.WriteLine($"Total = {total}");执行结果为:
x1 = 305
x2 = 46
Total = 351
y1 = 1000111
y2 = 5333666
Total = 6333777
C#整数的后缀字符
如果一个整数的后缀字符是 u 或 U,则表示此值的类型是 uint 或 ulong,C# 编译程序会由数值大小判断此值的类型,如果此值是在 uint 可以容纳的范围则此值的数据类型是 uint,否则此值是 ulong。如果一个整数的后缀字符是 l(小写的 L)或 L,则表示此值的类型是 long 或 ulong,C# 编译程序会由数值大小判断此值的类型,如果此值是在 long 可以容纳的范围则此值的数据类型是 long,否则此值是 ulong。
英文字 l(小写的 L)容易和阿拉伯数字 1 混淆,所以建议使用 L。
C# sizeof()函数
函数 sizeof() 可以回传数据类型的内存大小,所回传的单位是字节(Byte)。注意,sizeof() 函数的参数不可以使用变量名称,必须是数据类型。
【实例】列出以下整数数据所需的内存大小。
Console.WriteLine($"byte的长度 = {sizeof(byte)}"); Console.WriteLine($"short的长度 = {sizeof(short)}"); Console.WriteLine($"int的长度 = {sizeof(int)}"); Console.WriteLine($"uint的长度 = {sizeof(uint)}"); Console.WriteLine($"long的长度 = {sizeof(long)}"); Console.WriteLine($"ulong的长度 = {sizeof(ulong)}");执行结果为:
byte的长度 = 1
short的长度 = 2
int的长度 = 4
uint的长度 = 4
long的长度 = 8
ulong的长度 = 8