类型转换
来源:互联网 发布:泰国国王科技大学知乎 编辑:程序博客网 时间: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>/* 偷钱程序(3舍4入) 以1.23和1.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");}
阅读全文
0 0
- 类型转换
- 类型转换
- 类型转换
- 类型转换
- 类型转换
- 类型转换
- 类型转换
- 类型转换
- 类型转换
- 类型转换
- 类型转换
- 类型转换
- 类型转换
- 类型转换
- 类型转换
- 类型转换
- 类型转换
- 类型转换
- springmvc 验证框架
- oracle导入导出(impdb+expdb)
- [javac] Annotation processing got disabled, since it requires a 1.6 compliant JVM
- Spring Boot 拦截器
- 快速排序算法(冒泡算法改进版)
- 类型转换
- unity 查找root节点
- 优达(Udacity)smartcab
- 25.算法、正则、小游戏,倒转句子中的单词
- 开始学习 Python编程 从入门到实践。
- 深入理解 CSS 中的行高与基线
- 微农链的国内首创食品区块链产业前景如何
- SQL Alias(别名)
- oracle exp导出缺少表的处理