• 类型转换的那些事


      首先类型转换:将1个类型的变量的值 拿出来 有的时候经过处理,有的时候不经过处理  赋值给另外的1个类型的变量 的过程.

     类型转换分:1.自动类型转换 2. 强制类型转换 3.Parse转换 4.Convert转换等

     为什么要类型转换?

    因为类型不一致系统给你报错,就像我们要去国外,老外不直接收RMB呀,那我们首先要去银行把人民币转换成老外认得的头像吧!

     先来说说自动类型转换

    1.0 什么是自动类型转换?
         在数据类型兼容的情况下, 我们可以将1个小范围的变量的值 直接 赋值给 1个大范围类型的变量. 这样做是不会有任何问题的.
     所以C#就自动的帮助我们完成这个转换. 程序员不用做任何事情 只需要赋值就可以了.
     满 足 自动类型转换的条件.
     a. 两种变量的数据类型兼容 所有的数值类型之间和char类型之间相互兼容 特别强调:string类型与数值类型之间不兼容.
     b. 目标类型的范围比源类型大.
     char类型的变量的值 可以直接的赋值给1个int类型的变量.这个int类型的变量的值就是这个char数据的ASCII码.

    为变量赋值的时候: 赋值符号右边的数据表达式的类型 一定要和 左边的变量一致.
     byte b1 = 120;
     int num = b1;
     这样绝对不会有问题的.原因有两点:
     a. byte类型的变量和int类型的变量中存储的都是整型的数字.
     b. 无论b1变量中的值是多少. 都可以拿出来直接赋值给num变量. 因为byte类型的范围在int类型的范围之中.

    再来说说强制类型转换

    2.0   强制类型转换
     a. 在数据类型兼容的情况下,我们不能把1个大范围类型的变量的值 直接的 赋值给1个小范围的类型的变量.
     因为有可能会发生溢出的现象.
     不会发生溢出的情况: 大范围变量中的值 如果 刚好在 小范围的变量之中 那么这个时候不会溢出
     发生溢出的情况: 大范围变量中的值 如果 大于了 小范围的变量 那么这个时候就会发生溢出的现象.
     所以这个时候我们的C#我们的C#就不会帮助我们完成转换了.
    b. 如果程序员 就是要让 CPU把这个大范围变量中的值 赋值给 小范围的变量. 因为这个时候程序员可以保证不会溢出.
     我们就可以使用强制转换的语法来做这件事情.
     语法:
     (强制转换的类型)数据;
     int num = 12;
     byte b = (byte)num;
     这句话告诉C# 我知道这个地方将num变量的值赋值给b变量 有可能会发生溢出的情况* 但是没关系 CPU啊 你就赋值吧. 就算真的发生了溢出 不怪你.
     小括弧中写什么类型. 就要看你把大范围的变量中的值 强制的 拿出来 赋值给那个类型的变量.
     c. 强制转换完毕以后. 如果大范围变量中的值刚好在这个小范围变量之中 那么相安无事.
     如果大范围变量中的值 大于了 小范围的变量 那么这个时候 目标变量中的值就不是我们想要的了.
     所以我们在做强制转换的时候 一定要保证这个大类型变量中的值 在 小类型的变量范围之中.
     d. 强制转换的条件.
     1). 两种数据类型之间相互兼容. 再次强调 string和数值类型之间不兼容.
     2). 目标类型小于源类型.
     e. 强制转换做的事情.
     CPU将大范围变量中的值 强制的拿出来. 强制的赋值给小范围的变量.
     f. 数据类型的范围
     整型之间: long>int>short>byte
     浮点型之间: double>float>decimal
    浮点型的范围总是比整型的大.
     g. 将浮点型强制转换为整型,会将小数部分 活生生的 截掉. 直接保留整数部分.不会做四舍五入.
     h. 我们可以将1个char类型的数据 直接的 赋值给1个int类型的数据
     但是我们不能直接把1个int类型的数据赋值给1个char类型的数据 除非做强制转换.
     如果这样的话 char类型的变量的值 就是以这个int类型作为ASCII码对应的char数据.
     注意! 无论是强制类型转换还是自动类型转换 他们的首要前提是 数据类型兼容.
     兼容的数据类型: 所有的数值类型和char类型 再次的强调:string和别的类型不兼容.
     强制类型转换还是自动类型转换 他们都是内存级别的转换.

    3.0 Parse转换: 将字符串转换为其他的类型.

     a. 语法:
     要将字符串转换为什么类型 就什么类型.Parse(待转换的字符串);
     eg:
     string str = "123"; 希望将这个字符串转换为int类型的 那么写法
     int.Parse(str);

     b. 如何接收转换后的数据呢?
     声明1个对应的类型的变量来接收这句代码的结果就可以了.
     string str = "123";
     int num = int.Parse(str);
     num变量中的值就是转换成功以后的数据了.

     c. Parse转换只能讲字符串转换为其他的类型.

     d. 虽然Parse转换是将字符串转换为其他的类型. 但是不是说一定可以转换成功.
     转换成功的条件:
     如果字符串的 字面量 是1个指定类型的时候 那么这个时候就可以通过Parse转换将字符串转换为这个类型.
     什么叫做字符串的字面量: 就是字符串干掉双引号剩下的类型.

    4.0 Convert转换 ,是1个万能转换

    集前面三种转换于一身并且还有新增的转换. 
    任意的数据类型都可以通过Convert转换来相互转换.

    a. 语法
     要将指定的数据转换为什么类型就 Convert.To什么类型(待转换的数据);
     然后声明1个对应类型的变量来接收就可以了.

     stiring str = "123"; 要使用Convert将str转换为byte
     byte b = Convert.ToByte(str);
     b变量中就是转换成功后的值.

     b.需要注意的细节
     int--> Int32
     long-> Int64
     short-> Int16
     float -> Single
     bool -> Boolean
     其他的类型. 直接To就可以.

     c. Convert转换可以做自动类型转换的事情. 效果与自动转换的语法没有任何区别.
     如果做自动类型转换的话. 除非你有犯傻了, 否则你才会用Convert。这个就像一件衣服5块钱,你硬要给老板100元呀!

     d. Convert转换还可以做强制转换做的事情.
     强制转换的语法如果溢出 不会报错 只不过结果不是我们想要的.
     Convert转换 如果溢出 就会报异常.
     
     将浮点型强制转换的语法 转换为 整型 会截取掉小数部分.
     Convert会做四舍五入.注意 小数部分只有大于0.5的时候才会入 小于或者等于是不会入的.

     e. Convert转换还可以做parse转换做的事情 Convert可以讲字符串转换为其他的类型.
     当Convert转换字符串的时候 其实内部就是调用了parse转换.

     区别: 当字符串的值为null的时候 Convert转换返回0 Parse转换报异常.

     f. 将任意的数据转换为 字符串.
     调用这个数据的ToString()方法.

                  double d = 12.12;
                 string s = d.ToString();
                 Console.WriteLine(s+1);
    
           
                string str = "123aaa";
                int num = int.Parse(str);

      注意:自动类型转换和强制类型转换他们是内存级别的转换. Parse转换是1个加工、改造的过程并且只能将字符串转换为其他的类型!

    强制转换的意义:
    将浮点型强制转换为整型 会将小数部分活生生的砍掉. 直接保留整数部分.

    例如:

               double d1 = 12.999999999999;
                int i1 = (int)d1;
                Console.WriteLine(i1);

    输出的结果是:12

  • 相关阅读:
    Struts2中There is no Action mapped for namespace错误解决方法
    String字符串常量池简介
    main方法中参数"String[ ] args"详解
    自定义异常基本用法
    finally关键字执行的底层原理
    Linux环境下安装mysql5.6(二进制包不是rpm格式)
    finalize关键字小结
    "=="和equals小结
    super关键字小结(构造方法的执行是不是一定会创建对象?)
    冒泡排序
  • 原文地址:https://www.cnblogs.com/sabry34126/p/3768959.html
Copyright © 2020-2023  润新知