一周学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”)语句是错误的。

这是因为intC#关键字,而.net framework函数是设计成在所有的.met语言中都通用的。

必须注意的是byteC#中是无符号的。

注意:bytesbyte只是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的代码块中。

checkedunchecked操作符用来控制是否检查算术运算溢出。

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类型,就必须在数字后面加后缀Ff

123.F是错误的,因为C#认为这会引起歧义。

F究竟是123.这个浮点数的后缀,还是123这个int类实例的函数?

C#编译器认为这是个错误,因为int类没有F这个办法!

10      浮点数的操作符

¨      大部分的操作符和整数的一样
取余%是允许的(在C/C++是不允许的)
移位操作符是不允许的

¨      浮点数运算不会抛出错误
很小的结果会转为0
很大的结果会转为+/- Infinity
无效的操作,结果会转为NaN
只要有一个操作数是NaN,结果就转为NaN

11      浮点数的转换

float转为double
隐式转换
不会抛出错误

double转为float
显式转换
不会抛出错误

整数转为浮点数
隐式转换
不会抛出错误
会损失精度,但不会改变大小

浮点数转为整数
显式转换
可能会抛出溢出错误

 

 

 

posted @ 2009-01-29 11:47  怒杀神  阅读(305)  评论(0编辑  收藏  举报