zoukankan      html  css  js  c++  java
  • C语言进阶——类型转换04

    C语言内可以进行类型转换:

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

    强制类型转换的语法:

    • (tpye)value
    • (type)value_name

    强制类型转换的结果:

    • 目标类型可以容纳目标值:结果不变
    • 目标值不要能容纳目标值:结果将产生截断
    • 注意:不是所有的强制类型转换都可以成功,当不能进行强制类型转换的时候,编译器将产生错误信息

    示例代码1:

    •  1 #include <stdio.h>
       2 
       3 struct TS
       4 {
       5     int i;
       6     int j;
       7 };
       8 
       9 struct TS ts;
      10 
      11 int main()
      12 {
      13     short s = 0x1122;
      14     
      15     char c = (char)s;    // 0x22
      16     
      17     int i = (int)s;      // 0x00001122
      18     
      19     int j = (int)3.1415; // 3
      20     
      21     unsigned int p = (unsigned int)&ts;
      22     
      23     long l = (long)ts;   // error
      24     
      25     ts = (struct TS)l;   // error
      26     
      27     printf("s = %x
      ", s);
      28     printf("c = %x
      ", c);
      29     printf("i = %x
      ", i);
      30     printf("j = %x
      ", j);
      31     printf("p = %x
      ", p);
      32     printf("&ts = %p
      ", &ts);
      33     
      34     return 0;
      35 }

      直接赋值这段代码在23行和25行会产生错误,自定义类型不可以和传统类型进行强制类型转换

    隐式类型转换:

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

    隐式类型转换的发生点:

    • 算数运算中,低类型转换为高类型
    • 赋值表达式中,表达式的值转换为左边的类型
    • 函数调用的时候,实参转换为形参的类型
    • 函数返回值,return表达式转换为返回值类型

    下图是隐式类型转换的模式:

    • 当char类型和short进行运算时,会先隐式转换为int类型
    • 同样其他类型做运算时,都会按照图中的安全类型进行转换

    示例代码2:

     1 #include <stdio.h>
     2 
     3 int main()
     4 {
     5     char c = 'a';
     6     
     7     int i = c;    // safe
     8     
     9     unsigned int j = 0x11223344;
    10     
    11     short s = j;  // unsafe
    12     
    13     printf("c = %c
    ", c);
    14     printf("i = %d
    ", i);
    15     printf("j = %x
    ", j);
    16     printf("s = %x
    ", s);
    17     printf("sizeof(c + s) = %d
    ", sizeof(c + s));
    18     
    19     return 0;
    20 }

    总结:

    强制类型转换由程序员负责完成:

    • 转换可能产生截断
    • 转换不区分类型的高低
    • 转换不成功时,编译器给出错误信息

     隐式类型转换由编译器自动完成:

    • 低类型向高类型的转换时安全的
    • 高类型向低类型的转换是不安全的

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

  • 相关阅读:
    从Java小白到收获BAT等offer,分享我这两年的经验和感悟
    我的Java秋招面经大合集
    从零基础到拿到网易Java实习offer,我做对了哪些事
    设计模式常见面试知识点总结(Java版)
    如何才能够系统地学习Java并发技术?
    这些喜闻乐见的Java面试知识点,你都掌握了吗?
    Java集合类常见面试知识点总结
    用大白话告诉你 :Java 后端到底是在做什么?
    16-使用Selenium模拟浏览器抓取淘宝商品美食信息
    15-分析Ajax请求并抓取今日头条街拍美图
  • 原文地址:https://www.cnblogs.com/luojianyi/p/9201403.html
Copyright © 2011-2022 走看看