C04(类型转换)

1. C语言中的数据类型转换

C语言中,可以进行数据类型转换。有以下两种数据类型转换:

  • 强制类型数据转换
  • 隐式类型数据转换

如下图:

在这里插入图片描述

2. 强制类型转换

强制类型转换的语法为:

  • (Type)var_name; //对某一个变量名进行强制转换
  • (Type)value; // 对某一个值进行强制转换

强制类型转换的结果为:

  • 目标类型能够容纳目标值:结果不变

  • 目标类型不能容纳目标值:结果将产生截断

    注意: 不是所有的强制类型转换都能成功。当不能进行强制类型转换的时候,编译器将产生错误信息

实验分析

#include <stdio.h>

struct TS{
    int i;
    int j;
};

struct TS ts;


int main(){
    short s = 0x1122;
    
    char c = (char)s;
    
    int i = (int)s;
    
    int j = (int)3.1415;
    
    unsigned int p = (unsigned int)&ts;
    
    //long l = (long)ts;  //error,强制类型转换失败,编译器给处错误
    
    //ts = (struct TS)l;  //error,强制类型转换失败,编译器给处错误
    
    printf("s = %x\n", s);
    printf("c = %x\n", c);
    printf("i = %x\n", i);
    printf("j = %x\n", j);
    printf("p = %x\n", p);
    printf("&ts = %p\n", &ts);
    
    return 0;
}

编译运行结果为:

在这里插入图片描述

3. 隐式类型转换

隐式类型转换是编译器主动进行的转换,不需要手动强制转换,如下所示:

char c = 0;   // 变量c占用一个字节

short s = c;  // c到s隐式类型转换
int i = s;    // s到i隐式类型转换
long l = i;   // i到l隐式类型转换
  • 低类型到高类型的隐式类型转换是安全的,不会产生截断
  • 高类型到低类型的隐式类型转换是不安全的,会产生数据截断,导致结果不正常

如下图的隐式类型转换方向,一般是安全的转换方向(除非你作死):

在这里插入图片描述

作死示例

#include <stdio.h>
#include<iostream>
using namespace std;

int main() {

	int a = -100;
	unsigned int b = 10;

	printf("%u\n", a+b);  //打印 4294967206
	printf("%d\n", a + b); //打印 -90

	cout << a+b << endl;  //打印 4294967206

	return 0;
}

隐式类型转换代码分析:

#include <stdio.h>



int main()

{

    char c = 'a';

    

    int i = c;    // safe

    

    unsigned int j = 0x11223344;

    

    short s = j;  // unsafe

    

    printf("c = %c\n", c);

    printf("i = %d\n", i);

    printf("j = %x\n", j);

    printf("s = %x\n", s);

    printf("sizeof(c + s) = %d\n", sizeof(c + s));

    

    return 0;

}

编译运行结果为:

在这里插入图片描述

4. 总结

  • 强制类型转换由程序员来完成

    1. 转换可能产生截断
    2. 转换不区分类型的高低
    3. 转换不一定都能成功,不成功时,编译器,给出错误信息
  • 隐式类型转换由编译器自动完成

    1. 低类型向高类型的转换是安全的
    2. 高类型向地类型的转换是不安全的

044002035.png)

4. 总结

  • 强制类型转换由程序员来完成

    1. 转换可能产生截断
    2. 转换不区分类型的高低
    3. 转换不一定都能成功,不成功时,编译器,给出错误信息
  • 隐式类型转换由编译器自动完成

    1. 低类型向高类型的转换是安全的
    2. 高类型向地类型的转换是不安全的

标准C编译器的类型检查是比较宽松的,因此,隐式类型转换可能带来意外的错误

发布了123 篇原创文章 · 获赞 31 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/qq_40794602/article/details/105077908