C# 7.0 核心技术指南 (25):C#语言基础 2.4.5

阅读数:8 2019 年 11 月 30 日 23:37

C# 7.0核心技术指南(25):C#语言基础 2.4.5

(特殊整数类型运算)

内容简介
本书前三章将集中介绍 C#语言。首先介绍基本的语法、类型和变量。而后会介绍一些高级的特性,如不安全代码以及预处理指令。如果你是 C#语言的初学者,请循序渐进地阅读这些章节。
其余各章则涵盖了.NET Framework 的核心功能,包括 LINQ、XML、集合、并发、I/O 和网络、内存管理、反射、动态编程、特性、安全、应用程序域和原生互操作性等主题。第 6 章和第 7 章是后续主题的基础,除这两章之外,其余各章可以按照需要以任何顺序阅读。LINQ 相关的三个章节好按顺序阅读。其中的一些章节需要一些并发相关的知识,这些知识将在第 14 章中介绍。

(整数类型指 int、uint、long、ulong、short、ushort、byte 和 sbyte。)

2.4.5.1 整数除法

整数类型的除法运算总是会截断余数(向 0 舍入)。用一个值为 0 的变量做除数将产生运行时错误(DivideByZeroException):

复制代码
int a = 2 / 3; // 0
int b = 0;
int c = 5 / b; // throws DivideByZeroException

用字面量式常量 0 做除数将产生编译时错误。

2.4.5.2 整数溢出

在运行时执行整数类型的算术运算可能会造成溢出。默认情况下,溢出会默默地发生而不会抛出任何异常,且其溢出行为是“循环”的。就像是运算发生在更大的整数类型上,而超出部分的进位就被丢弃了。例如,减少最小的整数值将产生最大的整数值:

复制代码
int a = int.MinValue;
a--;
Console.WriteLine (a == int.MaxValue); // True

2.4.5.3 整数运算溢出检查运算符

checked 运算符的作用是:在运行时当整数类型表达式或语句超过相应类型的算术限制时不再默默地溢出,而是抛出 OverflowException。checked 运算符可在有 ++、–、+、-(一元运算符和二元运算符)、*、/ 和整数类型间显式转换运算符的表达式中起作用。

checked 运算符对 double 和 float 类型没有作用(它们会溢出为特殊的“无限”值,这会在后面介绍),对 decimal 类型也没有作用(这种类型总是会进行溢出检查)。

checked 运算符能和表达式或语句块结合使用,例如:

复制代码
int a = 1000000;
int b = 1000000;
int c = checked (a * b); // Checks just the expression.
checked // Checks all expressions
{ // in statement block.
...
c = a * b;
...
}

可以在编译时加上 /checked+ 命令行开关(在 Visual Studio 中,可以在“Advanced Build Settings”中设置)来默认使程序中所有表达式都进行算术溢出检查。如果你只想禁用指定表达式或语句的溢出检查,可以用 unchecked 运算符。例如,下面的代码即使在编译时使用了 /checked+ 也不会抛出异常:

复制代码
int x = int.MaxValue;
int y = unchecked (x + 1);
unchecked { int z = x + 1; }

2.4.5.4 常量表达式的溢出检查

无论是否使用了 /checked 编译器开关,编译时的表达式计算总会检查溢出,除非应用了 unchecked 运算符。

复制代码
int x = int.MaxValue + 1; // Compile-time error
int y = unchecked (int.MaxValue + 1); // No errors

2.4.5.5 位运算符

C#支持以下的位运算符:

运算符 含义 示例表达式 结果
~ 按位取反 ~0xfU 0xfffffff0U
& 按位与 0xf0 & 0x33 0x30
\| 按位或 0xf0 \| 0x33 0xf3
^ 按位异或 0xff00 ^ 0x0ff0 0xf0f0
<< 按位左移 0x20 << 2 0x80
>> 按位右移 0x20 >> 1 0x10

C# 7.0核心技术指南(25):C#语言基础 2.4.5

购书地址 https://item.jd.com/12681788.html?dist=jd

评论

发布