P2数据类型(基本数据类型)
布尔类型:boolean
基本介绍:
1) C语言标准(C89)没有定义布尔类型,所以C语言判断真假时以0为假,非0为真 [案例]
2) 但这种做法不直观,所以我们可以借助C语言的宏定义 。
3) C语言标准(C99)提供了_Bool 型,_Bool仍是整数类型,但与一般整型不同的是, _Bool变量只能赋值为0或1,非0的值都会被存储为1,C99还提供了一个头文件 <stdbool.h> 定义了bool代表_Bool,true代表1,false代表0。只要导入 stdbool.h ,就 能方便的操作布尔类型了 , 比如 bool flag = false;[了解]
条件控制语句; if
循环控制语句; while ...

自动类型转换
介绍:
当C程序在进行赋值或者运算时,精度小的类型自动转换为精度大的数据类型, 这个就是自动类型转换。
数据类型按精度(容量)大小排序为


案例演示:
演示一下基本数据类型转换的基本情况。
自动类型转换细节说明:
1) 有多种类型的数据混合运算时,系统首先自动将所有数据转换成精度最大的那种数据类型, 然后再进行计算(如int型和short型运算时,先把short转成int型后再进行运算)。
2) 若两种类型的字节数不同,转换成字节数大的类型,若两种类型的字节数相同,且一种有符 号,一种无符号,则转换成无符号类型
3) 在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边的类型将转换为左边的类型, 如果右边变量的数据类型长度比左边长时,将丢失一部分数据,这样会降低精度,丢失的部 分按四舍五入向前舍入。

强制类型转换
介绍:将精度高的数据类型转换为精度小的数据类型。使用时要加上强制转换符 ( ),但可能造成精度 降低或溢出,格外要注意。
强制类型转换一般格式如下: (类型名) 表达式 什么是表达式: 任何有值都可以称为表达式,比如 1+ 2, int num = 2; 这种强制类型转换操作并不改变操作数本身
案例演示 void main() {
double d1 = 156.89;
int num1 = (int)d1;
}
强制类型转换细节说明:
1) 当进行数据的从 精度高——>精度低,就需要使用到强制转换
2) 强转符号只针对于最近的操作数有效,往往会使用小括号提升优先级

基本数据类型转换-练习题 :
判断是编译是否会通过?
char c = 'a';
int i = 5;
float d = .314F;
double result = c+i+d; // c+i+d 类型是 float -> double ok

我的源码及注释:
#include <stdio.h>
//使用宏定义定义布尔类型(自己定义的布尔类型)
#define BOOL int
#define TURE 1
#define FALSE 0
void main(){
int isPass = -1;
//定义一个布尔变量
BOOL isOK = TURE;//等价 int isOK = 1;
if(isPass){//0表示真,非0表示假
printf("通过考试\n");
}
if(isOK){
printf("OKOKOK");
}
getchar();
}
/*
1.C语言标准(C89)没有定义布尔类型,所以C语言判断真假时,以0为假,非0为真。
2.但是这种做法不直观,所以我们可以借助C语言的宏定义。
3.C语言标准(C99)提供了_Bool型,_Bool仍然是整数类型,但与一般整数不同的是,_Bool变量只能赋值为0或1,
非0都会被存储为1,C99还提供了一个头文件<stdbool.h> 定义了bool代表_Bool,true代表1,false代表0,
只要导入stdbool.h头文件,就可以方便操作布尔类型,比如 bool flag = true;【vs2010是c89,所以不行哦,c99才可以】
布尔类型常用在 条件控制语句中、循环控制语句中
*/

/*自动类型转换
精度从低到高顺序:short-->int-->unsigned int-->long-->unsigned long-->float-->double-->long double
自动转换规则:char,short-->int-->unsigned int-->long-->double<--float
//说明:double在这里是最高精度,相同线上都可以转换
细节说明:
1.多种类型的数据混合运算,系统首先自动将 所有数据转换成精度最大的那种数据类型,然后再计算。
2.若两种类型的字节数不同,转换成字节数大的类型,字节数相同(且一种有符号,一种无符号),则转换成无符号类型。
3.赋值运算中,右边数据比左边长,将会丢失一部分数据,这样会降低精度(比如double-->float)
*/
#include <stdio.h>
void main(){
char c1 = 'a';
int num1 = c1;
double d1 = num1;
short s1 = 10;
int num2 = 20;
int num3 = s1 + num2;
float f1 = 3.456f;
double d2 = 6.6699336969;
f1 = d2;//会出现精度损失(double-->float)
printf("f1=%.10f",f1);//f1=6.6699337959,精度损失了
getchar();
}

/*强制类型转换
1.高精度转换为低精度会有个 warning警告,提示有精度损失
2.精度高的数据类型 转换成 精度低的数据类型,需要加上强制类型转换符(然后就不会有warning警告了),
但可能造成精度降低或溢出,要格外注意。
3.强制类型转换一般格式如下: (类型名) 表达式
【这种强制类型转换操作 并不会改变操作数本身。也就是说,转换后只是 返回转化后的结果 并赋值给某个变量,
原来的值和类型没有任何变化】
*/
//warning是可以运行的,但是在项目中,是不行的,不能要warning
#include <stdio.h>
void main(){
char c1 = 'a';
int num1 = 333;
double d1 = 666;
//计算会把精度 提高到 数据类型精度最高的类型
//int取整,会把小数部分直接截断(也就是直接丢掉)
int num2 = (int)3.6 * 10 + 8*0.5;//3*10+4.0=34.0(是double类型)-->int类型的34
int num3 = (int)(3.6 * 10 + 8*0.5);//int(3.6*10+4.0)-->int(40.0(double))-->int类型的40
//c1 = d1;//有警告 warning C4244: “=”: 从“double”转换到“char”,可能丢失数据
//强制类型转换
c1 = (char)d1;
printf("num2=%d\n",num2);//输出 num2=34
printf("num3=%d\n",num3);//输出 num3=40
printf("c1=%d\n",c1);//输出 c1=-102
//强制类型类型转换后,本身的值和类型都不会变,其他编程语言一般也是这种情况
printf("d1=%f\n",d1);//输出 d1=666.000000
getchar();
}