C#教程(2)———— 各式各样的数据类型
前言
在上一篇文章中,我们简单介绍了C#语言的历史,并通过一个简单的打印“HelloWorld”的程序,一起了解了C#程序的基本结构,那么在今天,我们将进一步学习更多的内容。
我们的现实生活中总是存在着各式各样的数据,比如总是不超过60分的考试成绩,比如银行卡中那不超过两位数的余额,在这样一个信息时代,仿佛世界都是由数据构成的,但事实上,我们的程序世界就是由各种数据构成的,就像我们需要用纸笔记下我们需要的数据一样,在程序中我们也需要将这些形形色色的数据保存起来,那么我们该如何保存这些数据呢?
1 数据类型概述
计算机无法像人类一样聪明,可以一眼看出我们写的是数字还是一段文字,所以在C#程序中,所有的数据都属于某一种数据类型,也只有通过不同的数据类型我们才能保存并处理各种各样的数据。
在C#中我们可以简单的把数据类型分为两大类。
- 值类型(Value types)
- 引用类型(Reference types)
在本章中,我们主要探讨的是其中的值类型。
2 值类型
在C#中,直接存储数据的数据类型我们称为值类型,就像数学中,我们经常假设"x=10",那么“x”就可以简单的等价为“10”这个数字,那么在C#中,值类型都包含哪些呢?
2.1 数值类型
数值类型是我们最为常见的一种数据类型,用于存储各种数字,包含整数和小数,但为了满足不同的运算需求,数值类型还能细分为十一种更加细致的类型。
2.1.1 整数类型
整数类型,顾名思义用于存储各种整数,对应各种不同的取值范围,整数类型一共有八种,不过在列举各种不同的数据类型之前,需要先解释几个概念。
- 位(bit):也叫比特,是计算机存储数据的最小单位,表示一个二进制位
- 字节:计算机存储数据的单位,一字节等于八位
- 有无符号:表示可否存储负数,有符号表示可以存储负数,无符号则只能存储正数
- 默认值:表示如果定义时没有给定具体值,默认取值为几
类型 | 字节数 | 有无符号 | 取值范围 | 默认值 |
---|---|---|---|---|
byte | 1 | 无 | 0-255 | 0 |
sbyte | 1 | 有 | -127-128 | 0 |
short | 2 | 有 | -32768~32767 | 0 |
ushort | 2 | 无 | 0~65535 | 0 |
int | 4 | 有 | -2147483648~2147483647 | 0 |
uint | 4 | 无 | 0~4292967295 | 0 |
long | 8 | 有 | -9223372036854775808~9223372036854775808 | 0 |
ulong | 8 | 无 | 0~18446744073709551615 | 0 |
八种整数类型变量定义及初始化方式如下:
byte byteValue = 1;
sbyte sbyteValue = -1;
short shortValue = -1;
ushort ushortValue = 1;
int intValue = -1;
uint uintValue = 1;
//c语言中,long类型是4个字节,但在C#中为8个字节
long longValue = -1;
ulong ulongValue = 1;
注:取值范围的计算方法
数据在计算机中保存是用二进制来进行保存的,因此能取到的值为多少需要借助数据类型的位数来进行运算。
简单的计算方法为:
对于无符号的,能取到的最小值为“0”,最大值为2的位数次方减去1(减一的原因是要给0一个位置)
如:uint类型,最大值为2^32 - 1
对于有符号的,计算是位数需要减去1,因为计算机存储负数时,会把第一位作为符号位,第一位为“0”表示正数,为“1”表示负数
如:int类型,最小值为2^31
最大值为2^31 - 1
2.2 浮点数类型
有了整数,自然也会有小数,在C#中,小数类型被称为浮点数类型,浮点数类型一共有三种。
- float:单精度浮点数,占4个字节
- double:双精度浮点数,占8个字节
- decimal:精确的十进制数值,占16个字节
这里需要注意的是,由于保存方式的原因,float和double两个浮点数类型都不是精确的浮点数类型,在存储时由于计算方法的原因会产生保存的数据和原数据本身有一定的偏差,所以我们不会使用这两种类型做精确的数值运算或比较,更不会用这两种类型来做金融运算。
decimal是一种特殊的浮点数类型,它的存储时精确的,不会产生偏差,他的存储方式不是存储数值,而是将数值视为字符保存,当需要时再转换为数值,相当于前两种是通过不精确的运算转换为二进制数据保存,但decimal类型是把写了数字的纸拍下来保存了,自然就更精确了。
浮点数类型变量定义及初始化方式如下
float floatValue = 3.1415926f;//注意,float类型变量赋值时需要在数字后加上f
double doubleValue = 3.1415926;
decimal decimalValue = 3.1415926m;//注意,decimal类型变量赋值时需要在数字后加上m
注:float和double两种数据类型,虽然字节数相差很大,但实际取值范围并没有什么区别,仅仅是精度不同,就好比保留16位小数会比保留8位小数更精确一样。
2.3 字符类型
字符类型用于存储输入的字符,如字母等,在C#中的保留字为"char",在程序中如果需要写一个字符,则需要把字符使用单引号引起来,例如:‘a’。
如果有接触过C语言的朋友应该知道,在C语言中,字符类型占字节数为1个字节,但在C#中,字符类型占2字节。
这里涉及到计算机如何保存一个字符,比如字母’a’,大家应该知道,计算机底层是使用二进制来存储所有数据的,也就是说计算机只认识“0”和“1”两个数字而已,那么是如何存储字母的呢?
这里就需要一个叫做编码表的东西了,最常用的编码表,也就是C语言才用的编码表叫做ASCII表,它的原理就是使用一个数字和字符进行对应,这样在保存时只需要存储一个数字,读取时再根据编码表对照找出对应的字符是谁就可以了,是不是很聪明?
如上图,我们可以看到,在ASCII码表中一共存储了256个不同的字符和数字的对应关系,基本囊括了我们键盘中的所有按键,所以其实ASCII码表主要是为了满足英文输入的需求,而“0-255”的取值,又刚好在一个字节可以存储的最大范围内,所以在C语言这类不支持中文的语言中,char类型一个字节就刚好够用了,但如果我们需要存储中文汉字又该怎么办呢?
根据《康熙字典》记载的汉字统共有四万多个,如此庞大数量的汉字还可以使用一个字节来进行保存了么,肯定不可以了,所以在C#中,字符类型采用了两个字节,用于存储包括简体汉字、繁体汉字以及其它语言如阿拉伯语等符号,当然也不会再继续使用ASCII码表了。
字符类型变量定义及初始化方式如下
//注意,char类型变量赋值时需要使用单引号将字符引起来
char charValue = 'A';
2.4 布尔类型
布尔类型在C#中的保留字为“bool”,占一个字节,布尔类型相对比较简单,只用于表达对(true)和错(false),主要用于比较运算,在后面讲到运算符时会详细提及。
布尔类型变量定义及初始化方式如下
bool boolValue = true;
2.5 其它值类型
在值类型中,还有枚举类型和结构体两种,不过这两种涉及到更多的知识,所以我们放在后续文章中详细介绍。
2.6 sizeof关键字
sizeof关键字会返回某一个数据类型的字节数大小,是用于检查数据类型字节大小的手段。
如:char类型通过sizof关键字会返回占字节数2,int类型为4,bool类型为1.
Console.WriteLine(sizeof(char)); // 2
Console.WriteLine(sizeof(int)); // 4
Console.WriteLine(sizeof(bool)); // 1
但需要注意,sizeof关键字在小括号中传入的只能是数据类型,如“int”、“char”等,不能是具体的变量。
char charValue = 'A';
Console.WriteLine(sizeof(char)); // 正常输出2
Console.WriteLine(sizeof(charValue)); //报错
总结
以上就是今天的主要课程内容,今天我们主要介绍了数据类型中的值类型,在编码过程中,清楚地掌握一个数据类型所占的字节数以及取值范围是一件非常重要的事情,比如在涉及到可能超过10位数的整数做运算时我们还能使用最常用的int类型做运算么?显然是不可以的,int类型的取值范围最大也就10位数,自然是无法使用int类型存储运算的。