一周学C#之第三天——值的类型
一周学C#_第三天
值的类型
1 整型
类型 |
位数 |
System. |
与CLS兼容? |
有无符号? |
sbyte |
8 |
SByte |
否 |
有 |
ushort |
16 |
UInt16 |
否 |
无 |
uint |
32 |
UInt32 |
否 |
无 |
ulong |
64 |
UInt64 |
否 |
无 |
|
|
|
|
|
byte |
8 |
Byte |
是 |
无 |
short |
16 |
Int16 |
是 |
有 |
int |
32 |
Int32 |
是 |
有 |
long |
64 |
Int64 |
是 |
有 |
有符号整型和字节型是属于“通用语言认证系统CLS”的。
无符号整型不属于CLS
原始的类型关键字(如int)或对应别名(System.Int32)都可以使用。
但是有唯一例外的情况是:当把类型名作为.net framework函数实参的时候,只能使用System.Int32,而不能使用int。
例如:你必须调用Type.GetType(“System.Int32”),而Type.GetType(“int”)语句是错误的。
这是因为int是C#关键字,而.net framework函数是设计成在所有的.met语言中都通用的。
必须注意的是byte在C#中是无符号的。
注意:byte和sbyte只是8位,因此它们不能作为数组的元素,因为数组元素的最小尺寸是16位(2字节)。
2 基本操作符
括号 |
(x) |
访问成员 |
x.y |
函数调用 |
f(x) |
访问数组(不是元素) |
a[x] |
自增 |
x++ |
自减 |
x-- |
调用构造函数 |
new |
获得类名 |
typeof |
获得尺寸 |
sizeof |
数值检查 |
(un)checked |
基本操作符具有最高的优先级。
new只能在调用构造函数的时候使用,并且不能被用来重载。
使用new来调用结构的构造函数会在栈(stack)中分配内存,而用new来调用类的构造函数会在堆(heap)中分配内存。
在C#中,结构是值类型的,类是引用类型的。
sizeof返回类或一个表达式的尺寸,但它只能用在标识为unsafe的代码块中。
checked和unchecked操作符用来控制是否检查算术运算溢出。
3 操作符的优先级别
基本操作符 |
见上表 |
一元操作符 |
+ - ! ~ ++x –x (T)x |
乘和除 |
*/ % |
加和减 |
+- |
移位 |
<< >> |
关系 |
<= <> >= is as |
相等 |
== != |
位操作 |
& ^ | |
布尔 |
&& || ?: |
赋值 |
= *= /= %= += -= |
所有的一元操作符都可以重载。
乘和除、加和减、移位、关系(is as除外)、相等和位操作可以重载。
&&和||只能使用true/false转换操作符时才可以重载。
?:和=不能重载。
复合赋值操作符(如*=/=)可以重载。
4 连接
规则一:除了赋值操作符外的其他二元操作符都是左连接的。
x+y+z 应该理解为(x+y)+z
规则二:赋值操作符和?:操作符是右连接的。
x=y=z理解为x=(y=z)
x+=y+=z理解为x+=(y+=z)
a?b:c?d:e理解为a?b:(c?d:e)
5 计算时的顺序
操作数是严格地从左到右被计算的。
int m=2;
int answer=++m * ++m + ++m * ++m
计算的顺序:
3 * ++m + ++m * ++m
3*4 + ++m + ++m
12 + ++m * ++m
12 + 5 * ++m
12 + 5 * 6
12 + 30
42
6 整数溢出
溢出错误
un/checked(表达式)
un/checked{语句}
int m=...
Method(checked(m * 2));
m=checked(m*2);
checked
{
Method(m*2);
m*=2;
}
以上的每一句语句都进行溢出错误检查。
Method(m*2);
m*=2;
以上的每一句语句在用csc/checked+ *.cs编译时,进行溢出错误检查。
而在用csc/checked- *.cs编译时,不进行溢出错误检查。
Method(unchecked(m * 2));
m=unchecked(m*2);
unchecked
{
Method(m*2);
m+=2;
}
以上的每一句都不进行溢出错误检查
checked(表达式)检查一个表达式的结果是否溢出。可以用于任何表达式,但是只能对整数操作符起作用,因为只能这些操作符才产生溢出,【这些操作符是++ 、-- 、-(负号) 、+-(加减号) 、* 、/ 、%以及整型之间的显示类型转换符】
checked(表达式)的结果也是一个表达式。(可以用来作为另一个表达式的一部分)
int outcome=checked(...);
checked{语句}检查一系列的语句结果是否溢出。(不是表达式,没有结果)
int noOutcome=checked{...};
7 整数转换
隐式转换,从小到大的转换
不会丢失精度,不会抛出错误
显示转换,从小到大的转换(强制转换)
可能会丢失精度,可能会抛出错误
int m=int.MaxValue;//整数的最大值
short s;
checked{s=(short)m;}//显示转换,会抛出溢出错误
long n;
checked{s=m;}//隐式转换,不会抛出溢出错误
8 类型转换表
|
sbyte |
short |
int |
long |
byte |
ushort |
uint |
ulong |
sbyte |
|
隐式 |
隐式 |
隐式 |
显式 |
显式 |
显式 |
显式 |
short |
显式 |
|
隐式 |
隐式 |
显式 |
显式 |
显式 |
显式 |
int |
显式 |
显式 |
|
隐式 |
显式 |
显式 |
显式 |
显式 |
long |
显式 |
显式 |
显式 |
|
显式 |
显式 |
显式 |
显式 |
byte |
显式 |
隐式 |
隐式 |
隐式 |
|
隐式 |
隐式 |
隐式 |
ushort |
显式 |
显式 |
隐式 |
隐式 |
显式 |
|
隐式 |
隐式 |
uint |
显式 |
显式 |
显式 |
隐式 |
显式 |
显式 |
|
隐式 |
ulong |
显式 |
显式 |
显式 |
显式 |
显式 |
显式 |
显式 |
|
9 浮点类型
类型 |
位数 |
System. |
与CLS兼容? |
后缀 |
float |
32 |
Single |
是 |
Ff |
double |
64 |
Double |
是 |
Dd |
C#默认的浮点类型是double,所以如果要使用float类型,就必须在数字后面加后缀F或f。
123.F是错误的,因为C#认为这会引起歧义。
F究竟是123.这个浮点数的后缀,还是123这个int类实例的函数?
C#编译器认为这是个错误,因为int类没有F这个办法!
10 浮点数的操作符
¨ 大部分的操作符和整数的一样
取余%是允许的(在C/C++是不允许的)
移位操作符是不允许的
¨ 浮点数运算不会抛出错误
很小的结果会转为0
很大的结果会转为+/- Infinity
无效的操作,结果会转为NaN
只要有一个操作数是NaN,结果就转为NaN
11 浮点数的转换
l float转为double
隐式转换
不会抛出错误
l double转为float
显式转换
不会抛出错误
l 整数转为浮点数
隐式转换
不会抛出错误
会损失精度,但不会改变大小
l 浮点数转为整数
显式转换
可能会抛出溢出错误