七、【C#】显式转换

七、类型转换——显式转换(C#)


提示:笔记中的内容是我自己的理解,可能会存在理解错误,也欢迎大家指正\( ̄︶ ̄*\))

1、显示转换

1.1 括号强转

1、语法:

变量类型 变量名 = (变量类型)变量;

例如:“隐式转换” 是将 “低精度” 转换为 “高精度”,比如可以将 “int类型” 隐式转换为 “long类型”,但不能将 “long类型” 隐式转换为 “int类型”;如果要把 "long类型"转换为 “int类型” 就要用到 “显示转换”。

作用:一般情况下,将 “高精度” 的类型显示转换为 “低精度” 的类型。会存在 “精度问题” 或者 “范围问题”


1.1.1 “有符号的整型” 之间的显示转换

举例1:

sbyte sb = 1;
short s = 1;
int i = 1;
long l = 1;

s = (short)i;  //将"int类型"的"i"强制转换为"short类型"
Console.WriteLine(s);

i = (int)l;     //将"long类型"的"l"强制转换为"int类型"
sb = (sbyte)s;  //将"short类型"的"s"强制转换为"sbyte类型"
sb = (sbyte)i;  //将"int类型"的"i"强制转换为"sbyte类型"
sb = (sbyte)l;  //将"long类型"的"l"强制转换为"sbyte类型"

举例2:

用 “括号强转” 可能会出现 “范围问题” 所造成的异常。

sbyte sb = 1;
short s = 1;
int i = 40000;
long l = 1;

s = (short)i;
Console.WriteLine(s);

//输出的结果为:
-25536

原因:因为 “short类型” 的取值范围为:“-32768~32767”。最开始 “i” 为 “int类型” 存放 “40000” 的数值,将 “i” 强制转换为 “short类型” 后,因为 “short类型” 最大只能存储 “32767”,如果存放 “40000” 就会出现 “范围问题” 造成的异常。


1.1.2 “无符号的整型” 之间的显示转换

“无符号的整型” 之间的显示转换的用法与 “有符号的整型” 之间的显示转换的用法是一样的,需要注意 “范围问题”

举例:

byte b = 1;
uint ui = 1;

b = (byte)ui;  //将"uint类型"的"ui"强制转换为"byte类型"

1.1.3 “浮点数” 之间的显示转换

“浮点数” 之间用 “括号强转” 可能会出现 “精度问题” 所造成的异常。

float f = 1.1f;
double d = 1.1234567890123456789f;

f = (float)d;  //将"double类型"的"d"强制转换为"float类型"
Console.WriteLine(f);

//输出结果为:
1.1234568

原因:因为 “double类型” 的精度比 “float类型” 高,当 “double类型” 的 “d” 强制转换为 “float类型” 时,会存在精度丢失的情况。


1.1.4 “无符号整型” 和 “有符号整型” 之间的显示转换

举例1:

“无符号整型” 和 “有符号整型” 之间用 “括号强转” 可能会出现 “范围问题” 所造成的异常。

uint ui2 = 1;
int i2 = 1;

ui2 = (uint)i2;  //将"int类型"的"i2"强制转换为"uint类型"
i2 = (int)ui2;   //将"uint类型"的"ui2"强制转换为"int类型"

举例2:

uint ui2 = 1;
int i2 = -1;

ui2 = (uint)i2;
Console.WriteLine(ui2);

//输出结果为:
4294967295

注意:如果 “有符号整型” 初始值为 “负数”,将其强制转换为 “无符号整型” 时,得到的结果可能有异常。


1.1.5 “浮点数” 和 “整型” 之间的显示转换

举例:

“浮点数” 和 “整型” 之间用 “括号强转” 可能会出现 “精度问题”。

uint ui2 = 1;
int i2 = -1;

i2 = (int)1.64f;

Console.WriteLine(i2);

//输出结果为:
1

注意:将 “浮点数” 强制转换为 “整型” 不存在 “四舍五入” 的情况,会直接抛弃掉小数点后面的小数。


1.1.6 “char类型” 和 “数值类型” 之间的显示转换

举例:

uint ui2 = 1;
int i2 = 1;

//"隐式转换"。将"char类型"的字符"A"隐式转换为"int类型"。所以输出结果是字符"A"的ASCII码。
i2 = 'A';
Console.WriteLine(i2);

//显示转换。前面将字符"A"进行隐式转换,将字符"A"的ASCII码赋值给"i2",再将"i2"显示转换为"char类型",输出结果是ASCII码对应的字符。
char c = (char)i2;
Console.WriteLine(c);

//输出结果为:
65
A

1.1.7 “bool类型” 和 “string类型” 之间的显示转换

注意:“bool类型” 和 “string类型” 不能进行 “显示转换”。


1.2 Parse法

1、作用:将 “字符串类型” 转换为对应的类型。

2、语法:

变量类型.Parse("字符串")

注意:字符串必须能够转换成对应类型,否则会报错;并且还要考虑 “字符串” 的取值范围是否在 “字符串” 转换后对应类型的取值范围内,否则也会报错。

举例1:

string str = "123";

int i4 = int.Parse(str);  //正确!
Console.WriteLine(i4);

float i5 = float.Parse("123.45");  //正确!
Console.WriteLine(i5);

int i6 = int.Parse("123.45");  //会报错!

//输出结果为:
123
123.45

原因: 因为字符串 “123.45” 如果想要转换,就要找到对应的类型,字符串 “123.45” 对应的 “float”,就应该转换为 “float”,而如果转换为 “int” 就会出错。

举例2:

short s3 = short.Parse("4");  //正确!
Console.WriteLine(s3);

short s4 = short.Parse("400000");  //会报错!
Console.WriteLine(s4);

原因:因为字符串 “400000” 转换为 “short类型” 后,“s4” 的值就变为 “400000”,而 “short类型” 的取值范围为 “-32768 ~ 32767”,而 “s4” 的取值不在 “short类型” 的范围内,所以会出现报错。

举例3:

bool b1 = bool.Parse("true");
Console.WriteLine(b1);

char c1 = char.Parse("A");
Console.WriteLine(c1);

//输出结果为:
True
A

1.3 Convert法

1、作用:更准确的将各个类型之间进行相互转换。

2、语法:

Convert.To目标类型(变量或常量)

注意:填写的变量或常量的数据类型要和 “目标类型” 一致,否则会出错。

举例1:

int a = Convert.ToInt32("12");  //正确!
Console.WriteLine(a);

int b = Convert.ToInt32("12.23");  //会报错!
Console.WriteLine(b);

原因:因为 “字符串12.23” 对应的是 “float”,而目标类型是 “int”,两者不一致,就会报错。

举例2:

int a = Convert.ToInt32("12");
Console.WriteLine(a);

a = Convert.ToInt32(1.6578f);  //将"浮点型"通过Convert方法转换为"整型"时,会"四舍五入"。
Console.WriteLine(a);

//"Convert法"也可以把"bool类型"转成"数值类型"。"true"对应"1";"false"对应"0"。
a = Convert.ToInt32(true);
Console.WriteLine(a);

a = Convert.ToInt32(false);
Console.WriteLine(a);

a = Convert.ToInt32('A');
Console.WriteLine(a);

//输出结果为:
12
2
1
0
65

注意:“Convert法” 的精度比 “括号强转” 好一点,因为 “Convert法” 会四舍五入。

3、“Convert法” 中每一个数据类型所对应的 “目标类型”:

sbyte sb1 = Convert.ToSByte("1");
short s1 = Convert.ToInt16("1");
int i1 = Convert.ToInt32("1");
long l1 = Convert.ToInt64("1");

byte sb2 = Convert.ToByte("1");
ushort s2 = Convert.ToUInt16("1");
uint i2 = Convert.ToUInt32("1");
ulong l2 = Convert.ToUInt64("1");

float f = Convert.ToSingle("13.2");
double d = Convert.ToDouble("13.3");
decimal de = Convert.ToDecimal("13.2");

bool b = Convert.ToBoolean("true");

char c = Convert.ToChar("A");

string str = Convert.ToString(123123);

1.4 “其他类型” 转换为 “string类型”

1、语法:

变量.ToString();

注意:“Convert法” 也可以将 “其他类型” 转换为 “string类型”。

举例1:

string str = 1.ToString();
str = true.ToString();
str = 'A'.ToString();
str = 1.2f.ToString();

int aa = 1;
str = aa.ToString();

bool b = true;
str = b.ToString();

举例2:

当我们进行字符串拼接时,就会自动调用 “ToString方法” 将其转换为 “string类型”。

Console.WriteLine("hello" + 1 + true);

string str = "world" + 1 + true + 1.23;
Console.WriteLine(str);

//输出结果为:
hello1True
world1True1.23

  • 19
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值