3 类型转换

1 强制类型转换

  • 强制类型转换的语法

    • (Type)var_name;
    • (Type)value;
  • 强制类型转换的结果

    • 目标类型能够容纳目标值:结果不变,如:short -> int
    • 目标类型不能容纳目标值:结果将产生截断,将高位舍弃,如:int -> short
    • 注意:不是所有的强制类型转换都能成功,当不能进行强制类型转化时,编译器将产生错误信息
    #include <stdio.h>
    
    struct TS
    {
    	int i;
    	int j;
    };
    
    struct TS ts;
    
    int main()
    {
    	short s = 0x1122;
    
    	char c = (char)s;  // 高位被截断:0x22
    	int i = (int)s;  // 0x1122
    	int j = (int)3.1415;  // 小数点后发生截断:3
    	unsigned int p = (unsigned int)&ts;  // 32位机器是4字节地址,不会发生截断,64位机器会发生截断
    	long l = (long)ts;   // error
    	ts = (struct TS)l;  // error
    
    	return 0;
    }
    

2 隐式类型转换规则

  • 隐式类型转换:编译器主动进行的类型转换
  • 低类型到高类型的隐式类型转换是安全的,不会产生截断
  • 高类型到低类型的隐式类型转换是不安全的,会导致不正确的结果

3 表达式中的隐式类型转换

  • 隐式类型转换的发生点

    • 算术运算式中,低类型转换为高类型
    • 赋值表达式中,表达式的值转换为左边变量的类型
    • 函数调用时,实参转换为形参的类型
    • 函数返回时,return 表达式转化为返回值类型
  • 安全的隐式类型转换

    char 
      ↓    -> int -> unsigned int -> long -> unsigned long -> float -> double
    short
    
  • 隐式类型转换分析

    #include <stdio.h>
    
    int main()
    {
    	char c = 'a';
    
    	int i = c;  //安全的隐式转换
    
    	unsigned int j = 0x11223344;
    
    	short s = j;  //不安全的隐式转换
    
    	printf("c = %c
    ", c);
    	printf("i = %d
    ", i);
    	printf("j = %x
    ", j);
    	printf("s = %x
    ", s);
    	printf("sizeof(c + s) = %d
    ", sizeof(c + s));  //同时转换成int再运算
    
    	return 0;
    }
    
    //输出结果:
    c = a
    i = 97
    j = 11223344
    s = 3344
    sizeof(c + s) = 4
    
原文地址:https://www.cnblogs.com/bky-hbq/p/13582427.html