10.类型转换-隐式转换
10.1 知识点
什么是类型转换
类型转换是指不同变量类型之间的相互转换。隐式转换是指不同类型之间自动转换,通常是从大范围向小范围转换。
相同大类型之间的转换
有符号:long
→ int
→ short
→ sbyte
long longValue = 1;
int intValue = 1;
short shortValue = 1;
sbyte sbyteValue = 1;
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;
doubleValue = floatValue;
特殊类型:bool
、char
、string
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;
总结:
- 高精度(大范围)装低精度(小范围)。
double
→float
→ 整数(无符号、有符号) →char
。decimal
→ 整数(无符号、有符号) →char
。string
和bool
不参与隐式转换规则。
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