C语言-显/隐式类型转换详解

  • 隐式类型转换基于基本数据类型(数值),同种类型的数据才能直接运算
    • 准则一:在表达式中,有无符号的char或short会被自动转换为int类型参与运算
      • (字符型,ASCII码对应十进制97)'a'+(short类型)12 =(以%d格式输出得到的结果) 109;
    • 准则二:包含两种数据类型的任何任何运算中,两个值都被转成两种类型中较高的类型,然后再计算。混合运算中,参照先算乘除再算加减,先参与运算的先进行类型转换(乘除部分),加减部分从左到右依次运算,最终会转换为参与运算中的数据类型最大的类型
      • (假设为int类型)2+(double类型)3.4 =(以%f格式输出得到的结果) 5.4;
    • 准则三:在赋值语句中,会被转换成赋值运算符左侧的类型,可能升级也可能降级
      • int a = 12.23; double截断转int,降级(实际应用中,会出现警告,但是这种隐式类型转换是合法的,只会导致丢失精度
      • double d = 12; int转double,升级(升级过程不是将12赋值给d之后才转换,而是12先升级为double类型之后才进行赋值
    • 特殊点一:
      • 32位操作系统下,long和int都是4个字节的数据类型,此时unsigned int > long
      • 64位操作系统下,long为8个字节的数据类型,此时long > unsigned int
      • 类型级别高到低顺序:
      • 排名没有涉及到char和short,因为已经被提升到int或者unsigned int

    • 特殊点二:
      • 只写一个不加任何后缀的小数如:3.3,会自动默认为double类型,会占用8个字节。加上后缀f,会被视为float类型,占用4个字节。
      • C 语言中 printf 输出 double 和 float 都可以用 %f 占位符 可以混用,而 double 可以额外用 %lf。
      • 而 scanf 输入情况下 double 必须用 %lf,float 必须用 %f 不能混用。
    • 特殊点三:
      • 隐式类型转换就是在上述情况下由系统自发进行的,有的非上述情况也存在自动转换的情况,这就是编译器的个人行为,比如malloc在vs能够正常使用,在其他编译不行。有的编译器会将malloc出来的内存空间进行隐式或者显式类型转换,但是有的编译器不会,这是编译器自发的行为属性
  • 显式类型转换
    • 类型一:参与运算的两个数据转换为类型较小的数据类型
      • (int类型)12+(double强制转换为int类型)(int)12.2 = (int类型)24;
    • 类型二:数据类型大的赋值给类型小的,得到的结果是余数
      • unsigned char c = (unsigned char)1234;此时c的值为210,计算过程为1234%256(256为无符号char型最大的数据个数)
  • 指针的强制类型转换只有SIZEOF(TYPE A) >= SIZEOF(TYPE B)时,A对B的指针强制转换合法
    • 错误示例一:越界操作
    • int a =12; double *p = (double *)&a; a为4字节的变量,内存空间强制转换为8字节的,就会越界操作4字节的
    • 合法示例一:占用内存大小相同,数据类型不同的强转
    • int a = 12; float *p = (float *)&a; *p =23.3; 虽然合法,但是运行会出错
    • 合法示例二:对8字节内存的各部分进行划分操作
    • double d = 12; int *p1 = (int *)&d;
    • *p1 = 23; 操作前面四字节 *(p1+1) = 24; 操作后面四字节 *((int *)((short *)p1+1)) = 12;操作中间四字节
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值