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

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

强制类型转换的语法:

  • (tpye)value
  • (type)value_name

强制类型转换的结果:

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

示例代码1:

  •  #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; // 0x00001122 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 ;
    }

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

隐式类型转换:

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

隐式类型转换的发生点:

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

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

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

示例代码2:

 #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 ;
}

总结:

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

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

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

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

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

C语言进阶——类型转换04的更多相关文章

  1. 【R笔记】R语言进阶之4:数据整形(reshape)

    R语言进阶之4:数据整形(reshape) 2013-05-31 10:15 xxx 网易博客 字号:T | T 从不同途径得到的数据的组织方式是多种多样的,很多数据都要经过整理才能进行有效的分析,数 ...

  2. 《C语言进阶剖析》课程目录

    <C语言进阶剖析>学习笔记                                                         本文总结自狄泰软件学院唐佐林老师的<C语言 ...

  3. JavaScript进阶系列04,函数参数个数不确定情况下的解决方案

    本篇主要体验函数参数个数不确定情况下的一个解决方案.先来看一段使用函数作为参数进行计算的实例. var calculate = function(x, y, fn) { return fn(x, y) ...

  4. 彩虹女神跃长空,Go语言进阶之Go语言高性能Web框架Iris项目实战-项目入口与路由EP01

    书接上回,我们已经安装好Iris框架,并且构建好了Iris项目,同时配置了fresh自动监控项目的实时编译,万事俱备,只欠东风,彩虹女神蓄势待发.现在我们来看看Iris的基础功能,如何编写项目入口文件 ...

  5. [C语言]进阶|数据类型: 整数, 浮点, 逻辑, 类型转换和条件运算

    --------------------------------------------------------------------------------- [C语言的类型] 1. 整型(都分为 ...

  6. R语言进阶

    一.初学入门:<R in Action><The Art of_R Programming>入门者可首选两本,前者从统计角度入手,分高中低三部分由浅入深的讲解了如何用R来实现统 ...

  7. 详解C语言的类型转换

    1.自动类型转换 字符型变量的值实质上是一个8位的整数值,因此取值范围一般是-128-127,char型变量也可以加修饰符unsigned,则unsigned char 型变量的取值范围是0-255( ...

  8. C语言自动类型转换

    自动转换遵循以下规则: 1) 若参与运算量的类型不同,则先转换成同一类型,然后进行运算. 2) 转换按数据长度增加的方向进行,以保证精度不降低.(eg:int型和long型运算时,先把int量转成lo ...

  9. [C语言]进阶|指针与字符串

    ------------------------------------------------------------------------------------ 回顾:[C语言]指针与字符串 ...

随机推荐

  1. 如何在K3 WISE BOS集成开发工具中自定义字段过滤条件

    1.结论 对于输入过滤条件后BOS报“列名不正确”的过滤条件,要在列名前增加x2标识 无效的过滤 FNumber ,,,,,) 正确的过滤 x2.FNumber ,,,,,) 2.完全可以不看的探索过 ...

  2. android里的继承浅析

    先看一段代码: abstract class A{ public A(){ this.print(); } public abstract void print(); } class B extend ...

  3. 启动selenium server

    java -jar selenium-server-standalone-2.37.0.jar

  4. 通过HTTP响应头让浏览器自动刷新

    以前如果需要让网页过几秒自动刷新一次,我都会在页面通过JS调用setTimeout来做,最近发现原来服务器通过添加响应头部信息来提示浏览器需要在多少时间之后重新加载页面. 代码很简单: respons ...

  5. oracle11g在CentOS6.9上启动脚本

    #!/bin/bash# chkconfig:2345 99 10# description: Startup Script for oracle Database# /etc/init.d/orac ...

  6. 笨办法学Python(三十五)

    习题 35: 分支和函数 你已经学会了 if 语句.函数.还有列表.现在你要练习扭转一下思维了.把下面的代码写下来,看你是否能弄懂它实现的是什么功能. from sys import exit def ...

  7. 查看Linux网卡地址,网络地址

    查看网络地址 ip a 或ip addr show 或ifconfig,此指令在部分linux系统中不支持

  8. 昂贵的聘礼,(最短路的应用),Poj(1063)

    题目链接:http://poj.org/problem?id=1062 很好的一道中文题. 思路: 把每种替换当做一条边,权重为交易优惠,就是求原点0到物品1的最短路. 这里有限制条件,每个节点还有等 ...

  9. 定位webpack文件大小

    之前发现一个神器,记录一下,可以可视化webpack打包的每个js文件大小,这样对我们优化代码是有帮助的,有目标的 https://www.npmjs.com/package/webpack-bund ...

  10. 2018.8.4session的removeAttribute()和invalidate()的区别

    session的removeAttribute()和invalidate()的区别 session.invalidate()是销毁跟用户关联session,例如有的用户强制关闭浏览器,而跟踪用户的信息 ...