首页 > 编程 > C# > 正文

C#的值类型运用详解

2023-05-09 18:58:29
字体:
来源:转载
供稿:网友

       在C#语言中,数据类型按其本身在内存中被存储的方式,可以将其归为两类:值类型和引用类型。其区别在于,值类型的变量直接存放实际的数据,而引用类型的变量存放的则是数据的地址,即对象的引用。

在这里首先介绍值类型。C#的值类型包括三种:简单类型、结构类型和枚举类型。其中,简单类型又包括:整数类型、浮点类型、小数类型、布尔类型和字符类型。下面我将一一作以介绍。

1.整数类型

按照,数据在内存中存储时所占的位长及是否有符号位,我们又可以把整数类型分成以下八种,其所占的位长和取值范围已经标在表格中:

类型

描述

取值范围

字节数

byte

无符号整数

0~255

1

sbyte

有符号整数

-128~127

1

short

有符号短整型

-32768~32767

2

ushort

无符号短整型

0~65535

2

int

有符号整型

-2147483648~2147483647

4

uint

无符号整型

0~4294967295

4

long

有符号长整型

-9223372036854775808~ 9223372036854775807

8

ulong

无符号长整型

0~188446744073709551615

8

系统默认整数类型为int。

在这里给大家解释一下关于有符号整型和无符号整型的含义。在计算机中,数据是以二进制的形式存储的。如十进制的9,在内存中存储的二进制数为(以8位计):0000 1001,但是如何表示一个数的正负呢,聪明的人们总是有办法的,就把二进制的最高位腾出来表示正负号,并且规定,最高位如果是1,则其所表示的数就是负数,如果是0,其所表示的数就是正数。问题似乎解决了,但是我们想一想,如果用这种方法的话,0又如何表示呢?假设在8位的内存单元中,存储的二进制数据是1000 0000,其转换为十进制数代表什么呢,按照这个规则,其应该是-0;如果存储的二进制数是0000 0000,其转换成十进制数又是什么呢?我们可以知道应该是+0;实际上,我们知道,-0和+0在十进制数中应该是相等相同的,可是在内存中表示方法不唯一,这样给计算机处理数据带来很大的麻烦。聪明的人们又想出了另外一个方法,即正数还是用刚才的方法来表达,而负数呢用补数来表示。

什么是补数呢?这里仅给出算法,更多的可参考相关书籍的说明。对于负数,其补数等于其反码+1,反码即对应的二进制数,除符号位之外,原来是0的变成1,原来是1的变成0,则-0的反码就是1111 1111,加1之后的补码为:1 0000 0000,然而,在8位内存单元中,1是溢出去的,只有后面的8个0才是有效的表示数的位,这样负数0和正数0都一样了。好了,现在回到正题。

2.浮点类型(float 和 double)

有两种,一种是单精度的即:float型的,另外一种是双精度型的即:double型的,这与其他语言如Java和C++相同。其中:float型的占4个字节,取值范围为:±1.5×10-28~3.4×1038其精度为7,即可表示7位数的小数,如123.3434,1.345628,1234.123。如果超过7位,则会进行四舍五入,如写成:234.54567,实际上系统处理成234.5457,如果整数部分超过7位,则以科学计数法进行表示,而且超过部分会被四舍五入,如浮点数12345747,则输出时为1.234575E+07。

双精度型的浮点数在内存中占8个字节,其取值范围为:±5.0×10-324~1.7×10308,精度为15或16,特点如单精度。

系统默认小数的类型为双精度型的,这意味着float f1=4.4;这样的语句将无法通过编译,因为在这里,4.4系统默认为双精度型的,不能将高精度的4.4赋给低精度的f1变量,解决办法,是在数字后加上字母f或F,表示该变量为单精度型的,即上面的语句应该写成:

float f1 = 4.4f;或者 float f1 = 4.4F;

3.小数类型(decimal)

在内存中占16个字节,一般用于对于精度有较高要求的场合,如表示原子的半径等,其数值范围为:±1.0×10-28~7.9×1028,可达29位小数。由于,系统默认小数为double型的,在给decimal赋值时,在数字后面要加m或M。如:

decimal dc = 23.567m;或者 decimal dc = 23.567M;

否则将给出编译错误:不能隐式地将 Double 类型转换为“decimal”类型;请使用“M”后缀创建此类型。

4.布尔类型(bool)

布尔类型是以英国著名数学家布尔的名字进行命名的,其值仅有两种:true和false。一般用于逻辑判断和条件表达式中,以后我们要介绍的选择结构、循环结构和逻辑操作符,将会更多地了解这种数据类型。

5.字符类型

字符类型与C++中的字符类型略微有点不同,那就是在C++中字符类型占1个字节,以ASCII码进行存储,而在C#中,占2个字节,是以Unicode码进行存储的。这是什么意思呢?ASCII码是美国国家信息标准交换码,它把26个大小写字母和10个数字、标点符号,以及其它常用的符号各以一个字节存储,至多可以表示存储256个字符。但是,随着计算机在其它国家的推广运用,这种ASCII编码却出现了问题:即不够用了,因为1个字节8位,至多表示256种情况,而就我们中国而言,文字成千上万,怎么来表示呢,还有韩文,日文,俄文等,于是人们用2个字节来表示这些信息。造成各国编码不一致的情形,后来有人就把他统一起来,不管是哪个国家的编码统一使用2个字节,这就是Unified Code(统一码),即Unicode。照这样讲,一些字符和数字之间是可以进行转换的,的确如此,如下:

int  iA = 'A'+23;

这里的iA应该是多少呢?告诉你,应该是88,怎么来的呢,因为字符’A’,在内存中以其Unicode码65进行存储,这样的话,字符型可以自动向整型int进行转换,所以结果为88。

另外,对于字符类型,是以单引号引起来的,千万不要用成双引号。这是两个不同的概念。如果用成双引号就成字符串了。

对于结构体和枚举类型将单独列出,敬请关注。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表