一、什么是值类型?
?
?
?
?
?
?
?
?
1、值类型是c#内置的表示简单数据的类型。
?
?
?
?
?
2、值类型的变量其实是函数的内部变量,所以存储在堆栈中。
?
?
① 因为在c#中没有全局变量,所有的变量都必须在对象或者函数存在。
?
?
② 当值类型变量在对象中存在时,值类型变量所在的整个对象都在堆中。
?
?
③ 在函数中的值类型变量就是局部变量,当然是在堆栈中。
?
?
?
④ 没有把简单的值类型变量也当做对象来处理是由于效率的考虑。
?
?
?
?
?
?
?
?
?
?
?
二、值类型有哪些?
?
?
?
?
?
?
?
?
c#类型名
CTS类型名
备注
?
?
?
?
?
bool
System.Boolean
true和false,不能写0和1
?
?
?
char
System.Char
双字节unicode
?
?
?
?
sbyte
System.Sbyte
单字节有符号
?
?
?
?
short
System.Int16
双字节有符号
?
?
?
?
int
System.Int32
四字节有符号
?
?
?
?
long
System.Int64
八字节有符号
?
?
?
?
byte
System.Sbyte
单字节无符号
?
?
?
?
ushort
System.Int16
双字节无符号
?
?
?
?
uint
System.Int32
四字节无符号
?
?
?
?
ulong
System.Int64
八字节无符号
?
?
?
?
float
System.Single
32位单精度
?
?
?
?
double
System.Double
64位双精度
?
?
?
?
decimal
System.Decimal
128位高精度
?
?
?
?
?
?
?
?
?
?
?
?
三、字面常量类型
?
?
?
?
?
?
?
?
1、字面常量如何表示?
?
?
?
?
?
?
十进制
300
?
?
?
?
?
?
?
十六进制
0x12c
0X12C
?
?
?
?
?
?
浮点数
300.0
3.00E+02
?
?
?
?
?
① 不支持八进制,0454和454相同,而不是300
?
?
?
?
② 不支持二进制,100101100b会导致编译错误。
?
?
?
?
?
2、显示的指定字面常量的类型。
?
?
?
?
?
① 字面常量分为整形字面常量和浮点型字面常量。
?
?
?
?
② 整形字面常量默认是int类型。
?
?
?
?
?
③ int类型字面常量在不超过变量范围的情况下可以赋值给其他值类型变量。
?
?
④ 浮点型字面默认是double类型。
?
?
?
?
?
⑤ 加上一些后缀,就可以对字面常量进行更多的限制。
?
?
?
?
L代表长整形,U,u代表无符号,F,f代表单精度浮点数,M,m代表高精度浮点数。
?
⑥ 对字面常量加上后缀以后,编译器就会对字面常量类型和变量类型进行严格匹配检查。例如:
sbyte a=10u,虽然没有超过范围,也会编译出错。
?
?
?
?
?
?
?
?
?
?
?
?
?
四、值类型变量之间的强制转换。
?
?
?
?
?
?
1、隐式转换会在小字节到大字节之间展开。
?
?
?
?
?
2、隐式转换不会在有符号到无符号之间展开,就算所占长度一样也不行。
?
?
3、隐式转换不会在bool类型到其他类型之间展开。
?
?
?
?
4、强制类型转换和c里的一样。
?
?
?
?
?