首页 > 编程笔记 > C#笔记 阅读:61

C#中的整数类型(非常详细)

C# 所有的整数数据中,最常见的整数是 int,此外还有其他整数的概念,可以参考下表。

表 1 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

程序中,x1 是 int 整数,其值是 2,147,483,647,常理推知,若将 x 值加 1,x 值应变成 2,147,483,648,但最终 x 的值变成 -2,147,483,648,这就是溢位的概念。

上述第 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

十进制是我们熟知的系统,其他进制系统基本概念如下:
在 C# 语言中,凡是以 0b 或 0B 为开头的整数都被视为二进制数字。例如,说出二进制 0b110001 和 0B1110 的十进制值:

0b110001 等于十进制的49;
0B1110 等于十进制的14;


在 C# 语言中,凡是以 0x 或 0X 开头的整数,皆被视为十六进制整数。例如,说明十六进制0x1A和0x20的10进制值:

0x1A 等于十进制的 26;
0x20 等于十进制的 32;

在十六进制的表示法中,0x1A 和 0x1a 意义一样的。

【实例】分别列出二进制和十六进制值的设定,加总后输出。
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

第 5 行的 WriteLine() 函数内参数字符串前方有 $ 字符,在这种状况下,可以使用大括号来内含变量,就可以输出变量内容,其他行的 WriteLine() 概念一样。

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

相关文章