译顺利通过,运行结果是各变量的值均为 1;当然,它们的类型分别还是 System.Byte 型……System.Double 型。现在我们来试试,假如把赋值的顺序反过来会怎么样呢?在 TestBasic() 函数中追加如下语句:
int g = 1;
short h = g;
this.textBox1.AppendText("h = " h.ToString() "n");
结果编译报错:
G:ProjectsVisual C#ConvertForm1.cs(118): 无法将类型“int”隐式转换为“short”
其中,Form1.cs 的 118 行即 short h = g 所在行。
这个时候,假如我们坚持要进行转换,就应该使用强制类型转换,这在 C 语言中常有提及,就是使用“(类型名) 变量名”形式的语句来对数据进行强制转换。如上例修改如下:
short g = 1;
byte h = (byte) g; // 将 short 型的 g 的值强制转换成 short 型后再赋给变量 h
this.textBox1.AppendText("h = " h.ToString() "n");
编译通过,运行结果输出了 h = 1,转换成功。
但是,假如我们使用强制转换,就不得不再考虑一个问题:short 型的范围是 -32768 ~ 23767,而 byte 型的范围是 0 ~ 255,那么,假如变量 g 的大小超过了 byte 型的范围又会出现什么样的情况呢?我们不妨再一次改写代码,将值改为 265,比 255 大 10
short g = 265; //265 = 255 10
byte h = (byte) g;
this.textBox1.AppendText("h = " h.ToString() "n");
编译没有出错,运行结果却不是 h = 265,而是 h = 9。
因此,我们在进行转换的时候,应当注重被转换的数据不能超出目标类型的范围。这不仅体现在多字节数据类型(相对,如上例的 short) 转换为少字节类型(相对,如上例的 byte) 时,也体现在字节数相同的有符号类型和无符号类型之间,如将 byte 的 129 转换为 sbyte 就会溢出。这方面的例子大同小异,就不具体说明了。
3. 字符的 ASCII 码和 Unicode 码
很多时候我们需要得到一个英文字符的 ASCII 码,或者一个汉字字符的 Unicode 码,或者从相关的编码查询它是哪一个字符的编码。很多人,尤其是从 VB 程序序转过来学 C# 的人,会报怨 C# 里为什么没有提供现成的函数来做这个事情——因为在 VB 中有 Asc() 函数和 Chr() 函数用于这类转换。
但是假如你学过 C,你就会清楚,我们只需要将英文字符型数据强制转换成合适的数值型数据,就可以得到相应的 ASCII 码;反之,假如将一个合适的数值型数据强制转换成字符型数据,就可以得到相应的字符。
评论加载中…
![]() |