C#编程(3_类型转换)

  无论什么类型,所有的数据都是一系列的位,即0和1。变量的含义是通过解释这些程序的方式来传达的。最简单的是char类型,这种类型用一个数字表示Unicode字符集中的一个字符。实际上,这个数字与ushort的存储方式完全相同——它们都存储在0~65535之间。

  然而,一般的,不同类型的变量使用不同的模式来表示数据,这意味着,即使把一系列的位从一种类型的变量移动到另一种类型的变量中,结果往往与预期不同。

  这并不是数据位从一个变量到另一个变量的一对一的映射,而是需要对数据类型进行转换。类型转换有隐式转换和显示转换之分。

  隐式转换:从A类型到B类型的转换可以再所有情况下进行,转换规则比较简单,可以让编译器执行。转换规则:任何类型A只要其取值范围完全包含在类型B的取值范围内,就可以隐式转换为类型B;

  显示转换:从A类型到B类型的转换只能在某些情况下进行,转换规则比较复杂,需要进行某种类型处理。

  请看下面例子:

//尝试将short值转换成byte值
byte destinationVar;
short sourceVar=7;
destinationVar=sourceVar;
Console.WriteLine("sourceVar:{0}",sourceVar);
Console.WriteLine("destinationVar:{0}",destinationVar);

如果编译这段代码,就会出现以下错误:

Cannot implicitly convert type ‘short‘ to ‘byte‘. An explicit conversion exists(are you missing a cast?)

从而引入强制转换(强迫数据从一种类型转换成另一种类型)语法比较简单:<(destinationVar的类型)sourceVar>,也就是改成:

byte destinationVar;
short sourceVar=7;
destinationVar=(byte)sourceVar;
Console.WriteLine("sourceVar:{0}",sourceVar);
Console.WriteLine("destinationVar:{0}",destinationVar);

这将把<sourceVar>中的short类型的值转换为<destinationVar>中byte类型的值。当然,这只是在某些情况下是可行的,彼此之间几乎没有什么关系的类型或根本没有关系的类型不能强制转换类型。

  显示的把数据从一种类型转换为另一种类型时,可能导致数据溢出,因为源变量的取值范围与目标变量的取值范围往往有出入,我们可以从其存储的数据本身(开始说了,实际是一系列的位)得到解析。

  检查溢出,要用到两个关键字checked和uncheked,称为表达式溢出的检查上下文。

byte destinationVar;
short sourceVar=7;
destinationVar=checked((byte)sourceVar);
Console.WriteLine("sourceVar:{0}",sourceVar);
Console.WriteLine("destinationVar:{0}",destinationVar);

如果修改变量sourceVar的值,使其大于255,执行程序就会出错,并提示溢出。

当然,还有Convert命令,它也用于显示的类型转换,下面给出以上所有类型转换的一个实例:

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            short shortResult, shortVar = 4;
            int integerVar = 67;
            long longResult;
            float floatVar = 10.5F;
            double doubleResult, doubleVar = 99.999;
            string stringResult, stringVar = "17";
            bool boolVar = true;

            Console.WriteLine("Variable Conversion Examples\n");
            doubleResult = floatVar * shortVar;
            Console.WriteLine("Implicit,->double:{0}*{1}->{2}", floatVar, shortVar, doubleResult);
            shortResult = (short)floatVar;
            Console.WriteLine("Implicit,->short:{0}->{1}", floatVar, shortResult);
            stringResult = Convert.ToString(boolVar) + Convert.ToString(doubleVar);
            Console.WriteLine("Implicit,->string:\"{0}\"+\"{1}\"->{2}", boolVar, doubleVar, stringResult);
            longResult = integerVar + Convert.ToInt64(stringVar);
            Console.WriteLine("Mixed,   ->long:{0}+{1}->{2}", integerVar, stringVar, longResult);
            Console.ReadKey();
        }
    }
}
时间: 2024-10-12 15:59:03

C#编程(3_类型转换)的相关文章

函数式编程的类型转换

1.基础类型转换为高阶类型(monad),以便使用函数式编程的特性:map.reduce,pipeline.业务组织.异步编程等: 2.高阶类型转化为基础类型:以便使用基础类型的态射(计算)功能. 3.高阶类型的内部转换(泛型类型转换)--类型关乎复合--以便业务的组织. 高阶类型起到桥接的功能. 函数式编程的类型系统开发的首要任务是搞清楚类型转换的规则: 高低层的双向转换(升降阶): 同级类型间的计算转换. 原文地址:https://www.cnblogs.com/feng9exe/p/104

JAVA并发编程3_线程同步之synchronized关键字

在上一篇博客里讲解了JAVA的线程的内存模型,见:JAVA并发编程2_线程安全&内存模型,接着上一篇提到的问题解决多线程共享资源的情况下的线程安全问题. 不安全线程分析 public class Test implements Runnable { private int i = 0; private int getNext() { return i++; } @Override public void run() { // synchronized while (true) { synchro

JAVA并发编程4_线程同步之volatile关键字

上一篇博客JAVA并发编程3_线程同步之synchronized关键字中讲解了JAVA中保证线程同步的关键字synchronized,其实JAVA里面还有个较弱的同步机制volatile.volatile关键字是JAVA中的轻量级的同步机制,用来将变量的更新操作同步到其他线程.从内存可见性的角度来说,写入volatile变量相当于退出同步代码块,读取volatile变量相当于进入同步代码块. 旧的内存模型:保证读写volatile都直接发生在main memory中. 在新的内存模型下(1.5)

Apache Commons Collections基本操作(Predicate、Transformat、Closure等)

一.Predicate断言 package Collections; import java.util.ArrayList; import java.util.List; import org.apache.commons.collections4.Predicate; import org.apache.commons.collections4.PredicateUtils; import org.apache.commons.collections4.functors.EqualPredic

More Effective C++

条款一:指针与引用的区别 指针与引用看上去完全不同(指针用操作符'*'和'->',引用使用操作符'.'),但是它们似乎有相同的功能.指针与引用都是让你间接引用其他对象.你如何决定在什么时候使用指针,在什么时候使用引用呢? 首先,要认识到在任何情况下都不能用指向空值的引用.一个引用必须总是指向某些对象.因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量.相反,如果变量肯定指向一个对象,例如你的设计不允许变量为

Python代码样例列表

├─algorithm│       Python用户推荐系统曼哈顿算法实现.py│      NFA引擎,Python正则测试工具应用示例.py│      Python datetime计时程序的实现方法.py│      python du熊学斐波那契实现.py│      python lambda实现求素数的简短代码.py│      Python localtime()方法计算今天是一年中第几周.py│      Python math方法算24点代码详解.py│      Pyth

编程题:为枚举类型变量赋值。将整型值强制类型转换成枚举类型赋值

编程题:为枚举类型变量赋值.将整型值强制类型转换成枚举类型赋值 #include<stdio.h> void main() { enum season {spring,summer,autumn,winter}s1,s2; s1=summer; s2=(enum season)2; printf("s1=%d,s2=%d\n",s1,s2); } 编程题:为枚举类型变量赋值.将整型值强制类型转换成枚举类型赋值,布布扣,bubuko.com

编程入门——工具初识、数据类型转换、数字类型

编程入门   零.引言 当我们学习一门语言时,最开始的是从一段代码开始,而书写和运行代码是从认识语言和使用工具展开.一个好的工具能对启蒙者有着寓意深远的影响.那么怎么界定一个好的工具选择呢? 一.工具初识 1.计算机语言:含义:指用于人与计算机之间的通讯语言. 计算机系统最大特征是指令通过一种语言传达给机器.为了使电子计算机进行各种工作,就需要有一套用以编写计算机程序的数字.字符.和语言规划,由这些字符和语法规则组成计算机指令(或各种语句).这些就是计算机能接受的语言.二进制是计算机使用的一种计

C#编程(四十一)----------用户定义的数据类型转换

用户定义的数据类型转换 C#允许定义自己的 数据类型,这意味着需要某些 工具支持在自己的数据类型间进行数据转换.方法是把数据类型转换定义为相关类的一个成员运算符,数据类型转换必须声明为隐式或者显式,以说明怎么使用它. C#允许用户进行两种定义的数据类型转换,显式和隐式,显式要求在代码中显式的标记转换,其方法是在原括号中写入目标数据类型. 对于预定义的数据类型,当数据类型转换时可能失败或者数据丢失,需要显示转换: 1.把int数值转换成short时,因为short可能不够大,不能包含转换的数值.