10.隐式转换

10.类型转换-隐式转换


10.1 知识点

什么是类型转换

类型转换是指不同变量类型之间的相互转换。隐式转换是指不同类型之间自动转换,通常是从大范围向小范围转换。

相同大类型之间的转换

有符号:longintshortsbyte
long longValue = 1;
int intValue = 1;
short shortValue = 1;
sbyte sbyteValue = 1;

longValue = intValue; 
longValue = shortValue; 
longValue = sbyteValue; 
intValue = shortValue; 
intValue = sbyteValue; 
shortValue = sbyteValue; 
无符号:ulonguintushortbyte
ulong ulongValue = 1;
uint uintValue = 1;
ushort ushortValue = 1;
byte byteValue = 1;

ulongValue = uintValue; 
ulongValue = ushortValue; 
ulongValue = byteValue; 
uintValue = ushortValue; 
uintValue = byteValue; 
ushortValue = byteValue; 
浮点数:decimaldoublefloat
decimal decimalValue = 1.1m;
double doubleValue = 1.1;
float floatValue = 1.1f;

doubleValue = floatValue; 
特殊类型:boolcharstring
bool boolValue = true;
char charValue = 'A';
string stringValue = "123123";

不同大类型之间的转换

无符号和有符号之间:
byte byteValue2 = 1;
ushort ushortValue2 = 1;
uint uintValue2 = 1;
ulong ulongValue2 = 1;
sbyte sbyteValue2 = 1;
short shortValue2 = 1;
int intValue2 = 1;
long longValue2 = 1;

intValue2 = byteValue2;
intValue2 = ushortValue2;
intValue2 = uintValue2;
intValue2 = ulongValue2;

longValue2 = byteValue2;
longValue2 = ushortValue2;
longValue2 = uintValue2;
浮点数和整数(有、无符号)之间:
float floatValue2 = 1.1f;
double doubleValue2 = 1.1;
decimal decimalValue2 = 1.1m;

floatValue2 = longValue2;
floatValue2 = intValue2;
floatValue2 = shortValue2;
floatValue2 = sbyteValue2;
floatValue2 = ulongValue2;
floatValue2 = uintValue2;
floatValue2 = ushortValue2;
floatValue2 = byteValue2;

特殊类型和其他类型之间的转换

bool boolValue2 = true;
char charValue2 = 'A';
string stringValue2 = "1231";

intValue2 = charValue2;
floatValue2 = charValue2;
uintValue2 = charValue2;
decimalValue2 = charValue2;

// 以下代码会报错
// boolValue2 = intValue2;
// charValue2 = intValue2;
// stringValue2 = boolValue2;
// stringValue2 = charValue2;

总结:

  • 高精度(大范围)装低精度(小范围)。
  • doublefloat → 整数(无符号、有符号) → char
  • decimal → 整数(无符号、有符号) → char
  • stringbool 不参与隐式转换规则。

10.2 知识点代码

using System;

namespace Lesson07_类型转换_隐式转换_
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("类型转换——隐式转换");
            // 什么是类型转换

            // 类型转换 就是不同变量类型之间的相互转换

            // 隐式转换的基本规则——>不同类型之间自动转换
            // 大范围装小范围

            #region 知识点一 相同大类型之间的转换

            //有符号  long——>int——>short——>sbyte
            long longValue = 1;
            int intValue = 1;
            short shortValue = 1;
            sbyte sbyteValue = 1;

            //可以用大范围 装小范围的 类型 (隐式转换)

            //隐式转换 int隐式转换成了long 因为long的范围比int大
            longValue = intValue;

            //不能够用小范围的类型去装在大范围的类型 会报错
            //intValue = longValue;


            longValue = intValue;
            longValue = shortValue;
            longValue = sbyteValue;

            intValue = shortValue;
            intValue = sbyteValue;

            shortValue = sbyteValue;


            //无符号 ulong——>uint——>ushort——>byte
            ulong ulongValue = 1;
            uint uintValue = 1;
            ushort ushortValue = 1;
            byte byteValue = 1;

            ulongValue = uintValue;
            ulongValue = ushortValue;
            ulongValue = byteValue;

            uintValue = ushortValue;
            uintValue = byteValue;

            ushortValue = byteValue;


            //浮点数  decimal    double——>float
            decimal decimalValue = 1.1m;
            double doubleValue = 1.1;
            float floatValue = 1.1f;

            //decimal这个类型 没有办法用隐式转换的形式 去存储 double和float
            //decimalValue = doubleValue;
            //decimalValue = floatValue;

            //float 是可以隐式转换成 double
            doubleValue = floatValue;

            //特殊类型  bool char string
            // 他们之间 不存在隐式转换
            bool boolValue = true;
            char charValue = 'A';
            string stringValue = "123123";

            #endregion

            #region 知识点二 不同大类型之间的转换

            #region 无符号和有符号之间
            //无符号 不能装负数的
            byte byteValue2 = 1; //0~255
            ushort ushortValue2 = 1;
            uint uintValue2 = 1;
            ulong ulongValue2 = 1;
            //有符号
            sbyte sbyteValue2 = 1;
            short shortValue2 = 1;
            int intValue2 = 1;
            long longValue2 = 1;

            //无符号装有符号 
            // 有符号的变量 是不能够 隐式转换成 无符号的
            //都会报错
            //byteValue2 = sbyteValue2;
            //ushortValue2 = sbyteValue2;
            //ulongValue2 = sbyteValue2;

            //有符号装无符号 
            // 有符号变量 是可以 装 无符号变量的 前提是 范围一定要是涵盖的 存在隐式转换
            //intValue2 = uintValue2;//因为 无符号的变量 可能会超过 这个有符号变量的范围
            intValue2 = byteValue2;// 因为 无符号的变量 不管是多少 都在 有符号变量的范围内

            #endregion

            #region 浮点数和整数(有、无符号)之间
            //浮点数装整数 整形转为浮点数 是存在隐式转换的
            float floatValue2 = 1.1f;
            double doubleValue2 = 1.1;
            decimal decimalValue2 = 1.1m;

            //浮点数 是可以装载任何类型的 整数的

            //float
            floatValue2 = longValue2;
            floatValue2 = intValue2;
            floatValue2 = shortValue2;
            floatValue2 = sbyteValue2;

            floatValue2 = ulongValue2;
            floatValue2 = uintValue2;
            floatValue2 = ushortValue2;
            floatValue2 = byteValue2;

            floatValue2 = 10000000000000000000;
            Console.WriteLine(floatValue2);//1E+19

            //double
            doubleValue2 = longValue2;
            doubleValue2 = intValue2;
            doubleValue2 = shortValue2;
            doubleValue2 = sbyteValue2;

            doubleValue2 = ulongValue2;
            doubleValue2 = uintValue2;
            doubleValue2 = ushortValue2;
            doubleValue2 = byteValue2;

            doubleValue2 = 10000000000000000000;
            Console.WriteLine(doubleValue2);//1E+19


            //decimal 不能隐式存储 float和double
            //但是它可以隐式的存储整形
            decimalValue = longValue2;
            decimalValue = ulongValue2;

            // double ——> float ——> 所有整形(无符号、有符号)
            // decimal ——> 所有整形(无符号、有符号)

            //整数装浮点数
            //整数是不能隐式存储 浮点数  因为 整数 不能存小数

            //报错
            //intValue2 = floatValue2;

            #endregion

            #region 特殊类型和其它类型之间


            bool boolValue2 = true;
            char charValue2 = 'A';
            string stringValue2 = "1231";

            //bool bool没有办法和其它类型 相互隐式转换

            //boolValue2 = intValue2;
            //boolValue2 = uintValue2;
            //boolValue2 = floatValue2;

            //intValue2 = boolValue2;
            //uintValue2 = boolValue2;
            //floatValue2 = boolValue2;

            //boolValue2 = charValue2;
            //charValue2 = boolValue2;
            //boolValue2 = stringValue2;
            //stringValue2 = boolValue2;


            //char char 没有办法隐式的存储 其它类型的变量

            //charValue2 = intValue2;
            //charValue2 = floatValue2;
            //charValue2 = uintValue2;
            //charValue2 = stringValue2;

            //char类型 可以隐式的转换成 整形和浮点型
            //其实是转为int类型
            //然后int类型又隐式转换为其他可以转换的类型
            //所以对于short和byte等这种存储范围小于int的类型
            //无法表现为隐式转换
            //char隐式转换成 数值类型是 
            //对应的数字 其实是一个 ASCII码 
            // 计算机里面存储 2进制
            // 字符 中文 英文 标点符号 在计算机中都是一个数字
            // 一个字符 对应一个数字 ASCII码就是一种对应关系
            intValue2 = charValue2;
            Console.WriteLine(intValue2);// 65 因为charValue2赋值为A A的ASCII码是65
            floatValue2 = charValue2;
            Console.WriteLine(floatValue2);// 65 因为charValue2赋值为A A的ASCII码是65
            uintValue2 = charValue2;
            Console.WriteLine(uintValue2);// 65 因为charValue2赋值为A A的ASCII码是65
            decimalValue2 = charValue2;
            Console.WriteLine(uintValue2);// 65 因为charValue2赋值为A A的ASCII码是65

            //string 类型 无法和其它类型进行隐式转换

            //stringValue2 = charValue2;

            //intValue2 = stringValue2;
            //uintValue2 = stringValue2;
            //floatValue2 = stringValue2;

            #endregion

            #endregion


            // 总结
            // 隐式转换 规则
            // 高精度(大范围)装低精度(小范围)
            // double ——> float ——> 整数(无符号、有符号)——>char
            // decimal ——> 整数(无符号、有符号)——>char
            // string 和 bool 不参与隐式转换规则的
        }
    }
}

10.3 练习题

数据类型的隐式转换例子

数据类型的隐式转换发生在大范围存储到小范围的情况下,例如:

// 大范围存小范围
// double——>float ——> 整形(无符号、有符号)——> char
// decimal ——> 整形(无符号、有符号)——> char
// long ——>int ——> short ——> sbyte
// ulong ——> uint ——> ushort ——> byte
// 无符号 没法 隐式存储 有符号的
// 有符号的 可以 隐式存储 无符号(范围大小)

//例如
int i = 1;
short s = 1;
i = s;

在这个例子中,short 类型的变量 s 被隐式转换为 int 类型的变量 i。因为 int 类型的范围大于 short 类型,所以这是一个合法的隐式转换。

字符转换成数字并打印

int tao = '韬';
Console.WriteLine(tao); // 38892

int lao = '老';
Console.WriteLine(lao); // 32769

int shi = '狮';
Console.WriteLine(shi); // 29422

Console.WriteLine(tao + lao + shi); // 101283

// 加了不能运算的字符串才会拼接,自动调用ToString()方法
Console.WriteLine("韬老狮对应的数字编号:" + tao + lao + shi);
// 韬老狮对应的数字编号:388923276929422

在这个例子中,将字符 ‘韬’、’老’、’狮’ 转换成数字,并将它们相加。注意,这里的数字是字符的 ASCII 码值。


10.4 练习题代码

using System;

namespace Lesson07_练习题
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("隐式转换练习题");

            #region 练习题一
            //什么情况下会出现数据类型的隐式转换,请举例说明
            // 大范围存小范围
            // double——>float ——> 整形(无符号、有符号)——> char
            // decimal ——> 整形(无符号、有符号)——> char
            // long ——>int ——> short ——> sbyte
            // ulong ——> uint ——> ushort ——> byte
            // 无符号 没法 隐式存储 有符号的
            // 有符号的 可以 隐式存储 无符号(范围大小)

            //例如
            int i = 1;
            short s = 1;
            i = s;

            #endregion

            #region 练习题二
            //请将自己名字的每一个字符转换成数字并打印出来
            //char t = '韬';
            //ASCII 码
            int tao = '韬';
            Console.WriteLine(tao);//38892
            int lao = '老';
            Console.WriteLine(lao);//32769
            int shi = '狮';
            Console.WriteLine(shi);//29422
            Console.WriteLine(tao + lao + shi);//会进行数字运算


            //加了不能运算的字符串才会拼接自动调用ToString()的方法
            Console.WriteLine("韬老狮对应的数字编号:" + tao + lao + shi);
            //韬老狮对应的数字编号:388923276929422

            #endregion
        }
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏