类型转换

来源:互联网 发布:泰国国王科技大学知乎 编辑:程序博客网 时间:2024/06/16 15:16

类型转换

在进行数据的运算时,常常会发生数据类型转换,主要分为自动类型转换和强制类型转换。

自动类型转换

所谓自动就是表示小的数值(char,short,int)可以存储在表示范围大(long,float,double)的变量中,而且在执行算术运算时会自动类型转换。如下程序所示。

#include <stdio.h>#include <stdlib.h>/*    自动类型转换    @author tony ittimeline@163.com    @date 2017/11/22 10:45    @website www.ittimeline.net*/void auto_convert() {    char ch = 'A';    printf("char类型的变量占据的字节数量为%d\n",sizeof(ch));    printf("字符'A'+1后占据的字节数量为%d\n",sizeof(ch+1)); //整数默认是占据四个字节的int,    printf("字符'A'+1.0后占据的字节数量为%d\n", sizeof(ch + 1.0));//浮点数默认是占据八个字节的double    system("pause");}

如果有多种数据类型(char,long,double)参与运算,运算结果的数据类型是double。

#include <stdio.h>#include <stdlib.h>/*    @author tony ittimeline@163.com    @date 2017/11/25 9:24    @website www.ittimeline.net*/void operator_type() {    //低字节往高字节转    //char--> short--> int--> unsinged--> long -->float--> double    int num = 12;    double  height = 626;    char value = 'A';    printf("运算结果的数据类型占据的字节数量为%d\n",sizeof(num+height+value)); //最终计算的结果是double类型    system("pause");}

强制类型转换

在某些应用场景中还需要截取数据的整数部分,这时候就需要使用到强制类型转换实现,在表达式的前面加上括号,括号中声明转换的数据类型即可,如下应用案例所示。

#include <stdio.h>#include <stdlib.h>/*    强制类型转换:将表示范围大的值赋值给表示范围小的变量会损失精度    @author tony ittimeline@163.com    @date 2017/11/25 9:43    @website www.ittimeline.net*/void force_convert() {    float fl_val1 = 10.8;    float fl_val2 = 10.3;    //()的优先级高于算术运算符    int num = (int)fl_val1 + fl_val2;//20 (int)作用于fl_val1    int num2 = (int)(fl_val1 + fl_val2); //21 (int)作用于fl_val1+fl_val2    printf("num=%d\n",num);    printf("num2=%d\n", num2);    double dbval = 3.0;//自动类型转换    int intVal = 6.7; //损失精度    printf("dbval=%d\n", dbval);    printf("intVal=%d\n", intVal);    system("pause");}

数据的强制类型转换是在CPU内部的寄存器完成的,一般不改变原有的变量值,如下应用程序所示

#include <stdio.h>#include <stdlib.h>/*    数据类型转换是在CPU内部的寄存器完成的    @author tony ittimeline@163.com    @date 2017/11/25 17:43    @website www.ittimeline.net*/void convert_data() {    double db = 3.14;    int val = (int)db;    printf("db=%d\n", db);//原有的值不会变    printf("val=%d\n", val);//在CPU内部的寄存器完成转换    system("pause");}

#include <stdio.h>

#include <stdlib.h>/*    printf函数在输出数据时不会按照类型进行转换,    如果需要输出指定类型的数据,需要自己进行强制类型转换    @author tony ittimeline@163.com    @date 2017/11/25 9:19    @website www.ittimeline.net*/void printf_convert() {    printf("%d\n",(int)3.14);//(int)3.14 就是将double类型的3.14强制转换为int类型的3    printf("%f\n",(float)10);    system("pause");}

数据类型转换的内存原理

有符号数据:低字节往高字节转换,按照符号位填充

无符号数据:按0填充

#include <stdio.h>#include <stdlib.h>/*    数据类型转换转换的原理    低字节往高字节转是按照符号位填充    @author tony ittimeline@163.com    @date 2017/11/25 17:43    @website www.ittimeline.net*/void convert_principle() {    //ch的二进制表示为0000 0001    char ch = 1;    //num的二进制表示为0000 0000 0000 0000 0000 0000 0000 0001    int num = 1;    printf("ch=%d\n", ch);//    printf("num=%d\n", num);//    ch = -1;    num = ch;    printf("ch=%d\n", ch);//    printf("num=%d\n", num);//    system("pause");}

强制类型转换的应用程序如下所示:

实现三舍四入

#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h>/*    偷钱程序(34入) 以1.231.24为例    // 1.23*10=12.3 12.3+0.6 =(int)12  12/10=1.2<1.23 能偷钱    // 1.24*10=12.4 12.4+0.6=(int)13   13/10=1.3>1.24 不能偷钱    @author tony ittimeline@163.com    @date 2017/11/26 17:43    @website www.ittimeline.net*/void getMoney() {    printf("请输入你的账户金额\n");    double money = 0.0;    scanf("%lf",&money);    printf("你的账户余额是%lf\n",money);    double result = (int)(money * 10 + 0.6) / 10.0;    printf("result = %lf",result);    //可以偷钱    if (result<money) {        printf("可以盗窃的金额是%lf",money-result);    }    system("pause");}
原创粉丝点击