目录

【飞郁2022新课程】15 - 强制转换类型

一、强制转换类型

1.从名字上来理解关键在于类型转换中“转换“二字的理解

2.想必大家也能理解 其实就是 一种类型转换为另一种类型

3.类型转换分为: 显示转换 和 隐示转换

4.区别在于 显示需要再变量名前加(需要转换的类型名) 而隐示转换是不需要加的 会自动根据定义的类型自动转换

5.虽然说是自动转换 但是也要做注意 可不是任何类型都可以任意转换的哦

二、强制转换注意事项

1.转换的类型 和 被转换的类型 的数据宽度

2.数据类型

三、显示转换

3.1 有符号和无符号在数据宽度 基本类型相同的转换

1
2
3
4
5
6
7
8
void main()
{
  unsigned char a =198  ;
  char b = (char)a;
  printf("a: %d\n",a);
  printf("b: %d\n",b);
 system("pause");
}

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/71c4c9ed853fc8dcd47e1e165bd9c85a2b367218.png@504w_122h_progressive.png

3.2 数据宽度不同的情况转换

类型不是可以随意强制转换的,数据宽度要相同 否则会丢失数据 除非特意安排

1
2
3
4
5
6
7
8
void main()
{
  int a = 0x12345678;
  char b = (char)a;
  printf("a: %d\n", a);
  printf("b: %d\n", b);
  system("pause");
}

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/f2544f81352553fa829a59be65c9cb5c9aed74e1.png@486w_120h_progressive-20211126165039425.png

3.3 数据类型不同 但 数据宽度相同的 转换

3.3.1 float转int

1
2
3
4
5
6
7
8
void main()
{
  float a = 333.33;
  int b = (int)a;
  printf("a: %f\n", a);
  printf("b: %d\n", b);
  system("pause");
}

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/b49acb011c4d349d7c93d6489ded22a88ff4ae3c.png@492w_123h_progressive-20211126165054214.png

我们会看到当float类型转int类型,小数部分会省略,这里注意可不是四舍五入哦!

3.3.2 int转float

1
2
3
4
5
6
7
8
void main()
{
  int a = 333;
  float b = (float)a;
  printf("a: %d\n", a);
  printf("b: %f\n", b);
  system("pause");
}

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/f714e57c9523e2629f599f9f0a80fbeb1d7c6153.png@486w_123h_progressive-20211126165104683.png

继续发现当int类型转float类型,会在后面多出6个0成为浮点数也就是小数

3.4 字符串和数字之间的转换

上面的数据类型转换都是数字之间的转换,那么如果字符串和数字之间的转换能直接强制转换得到我们想要的结果吗?答案肯定是否定的.

例如:

1
2
3
4
5
6
7
8
void main()
{
  char name[6]={'1','2','3','4','5','\0'};
 int  nameID=(int)name;
  printf("a: %s\n", name);
  printf("b: %d\n", nameID);
  system("pause");
}

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/ffcf767494398d6d4c427f3e1764b10127b37fcb.png@585w_143h_progressive.png

虽然能编译成功,但是结果完全不是我们想要的,会导致得到很多不确定的值.

所以我们要确保类型能正确的转换.

那么我们的字符串就不能转换成数字吗?答案也是否定的, 当然能转换,只是需要一个转换函数,atoi();类似这样的类型转换函数C/C++有很多库函数,这里就不一一列举了.我们改进下刚才的代码.

1
2
3
4
5
6
7
8
void main()
{
  char name[6]={'1','2','3','4','5','\0'};
  int  nameID=atoi(name);
  printf("a: %s\n", name);
  printf("b: %d\n", nameID);
  system("pause");
}

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/2f61dd22f11c700df10654d327d7bf9aed80c145.png@587w_144h_progressive-20211126165116702.png

看!我们得到了我们想要的数字了!

3.5 总结

\1. 类型转换要考虑 类型的宽度 和 类型种类.

\2. 不要随意转换类型,我们必须确保我们能知道最后的结果.例如:数据截断导致的丢失数据(除非在特定的场合下).

\3. 使用类型转换函数能够转换强制转换不能够直接转换的类型.

四、隐示转换

1.其实上面讲到了显示转换,这个隐示转换就一回事了,只是隐示转换不需要在变量名加(需要被转换类型)

2.但是要特别注意的就是我们必须要明确知道编译器是怎么自动判断转换的是什么类型.

3.比如

1
2
3
4
5
6
7
8
void main()
{
  int a = 0x12345678;
  char b = a;
  printf("a: %d\n", a);
  printf("b: %d\n", b);
  system("pause");
}

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/f6fb602bd78f6ab689359aee3553792d078204ee.png@485w_122h_progressive.png