从零开始学C语言系列之第四章《类型转换》

往期回顾

1.【第一章】《认识C语言》
2.【第二章】C语言概述及基本知识1
3.【第二章】C语言概述及基本知识2
4.【第三章】字符串和格式化输入/ 输出
5.【第三章】 printf
6.【第三章】 scanf
7.【第三章】 putchar
8.【第三章】 getchar
9.【第三章】 sizeof
10.【第三章】 strlen
11.【第三章】 define
12.【第四章】运算符第一节
13.【第四章】运算符第二节
14.【第四章】运算符第三节
15.【第四章】运算符第四节


通常,在语句和表达式中应当使用的是类型相同的变量和常量。但是如果是混合类型的,C会采用一套自动类型转化

类型转化规则如下:

1:当类型转换出现在表达式时,无论了unsigned还是signedcharshort都会自动转化成intfloat会被自动转化成double。由于都是从小类型转化大类型,所以这些欣慰叫做/*升级*/

2:涉及两种类型的运算,两个值会被分别转化成两种类型的更高级别。

3:类型的级别类型是(由高到低)
	long doubledoublefloatfloatunsigned long longlong longunsigned longlongunsigned intint
特殊情况:longint的大小相同时,unsigned intlong级别高

4:在赋值表达式语句中,计算的最终结果都会被转换成被赋值变量的类型,这个过程可能导致类型升级或者降级,所谓/*降级*/、是指把一种类型转化成更低的类别

类型的升级一般都不会有什么问题,但是降级会导致真正的麻烦

原因:较低类型可能放不下高类型的值

如果待赋值得值与目标类型不匹配得话得规则:

1:目标类型是无符号得整形,且待赋值得值是整数得时,额外的位将会被忽略
	例如:如果目标是8位unsigned char,待赋值是原始值求模256
	
2:如果目标类型是一个有符号的整数,且待赋值的值是整数,结果因实现而异。

3:如果目标类型是一个整形,且待赋值的值是浮点数,这种行为未定义

4:如果把一个浮点值转化位整形,原来的浮点值将被截断

例程:

#include <stdio.h>
int main(void)
{
    char ch;
    int i;
    float fl;
    
    fl = i = ch = 'C';                                  /* line 9  */
    printf("ch = %c, i = %d, fl = %2.2f\n", ch, i, fl); /* line 10 */
    ch = ch + 1;                                        /* line 11 */
    i = fl + 2 * ch;                                    /* line 12 */
    fl = 2.0 * ch + i;                                  /* line 13 */
    printf("ch = %c, i = %d, fl = %2.2f\n", ch, i, fl); /* line 14 */
    ch = 1107;                                          /* line 15 */
    printf("Now ch = %c\n", ch);                        /* line 16 */
    ch = 80.89;                                         /* line 17 */
    printf("Now ch = %c\n", ch);                        /* line 18 */
    
    return 0;
}
  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值