4-数据类型
一.数据在内存中的存储
我们上述,所介绍的数据类型,全部都可以分为两种, 分别⽤两个关键字对应。
超出范围数据的计算方法:
1.数据范围
char , 有符号类型, 占 1bytes。 可以表示负数,0,正数。范围 [-128~127] -128 ~ -1 0~127
unsigned char , ⽆符号类型,占 1bytes。可以表示 0,正数。范围 [0~255]
2.设计规则
⽆符号类型的数原码, 反码,补码是它本身. [正数和 0]
有符号类型的数的最⾼位表示符号位, 0 表示为正数,1 表示为负数
负数的反码 = 符号位不变,其他位按位取反
负数的补码 = 反码 + 1
3.计算方法
先计算整数的补码 (= 右边的数)
把补码赋值给变量,然后观察变量的数据类型。
若是为 unsinged char 类型,⼀定为正数或 0,原, 反, 补⼀样.%d 输出的原码就是补码。
直接转换为元素输出即可。
若是为 char 类型, 观察变量内存存储数据的最⾼位, 1 表示为负数,%d 输出需要转换为原码输出.
二. 数据类型的强制转换
强转类型: 采⽤某⽅式将某种数据类型强制转换位我们需要的数据类型.
注: 强转只是临时强转,本身的数据类型没有改变。
1.隐式转换
(1)不同类型整数进行运算,窄类型整数自动转换为宽类型整数,有符号整数转换为无符号整 数。
(2)不同类型浮点数进行运算,精度小的类型自动转换为精度大的类型。
(3)整数与浮点数进行运算,整数自动转换为浮点数。
// 整型提升
short s1 = 10;
int n1 = 40000;
// 运算过程中,变量 s1 是 short 类型,会自动转为 int 类型
printf("%d \n", s1 + n1);
// 有符号整数自动转为无符号整数
// int n2 = 100;
int n2 =-100;
unsigned int n3 = 20;
// 负数转为无符号整数,两者绝对值的和是无符号整数的最大值再加 1
printf("%u \n", n2 + n3);
// 不同类型的浮点数运算,精度低的转诶精度高的
float f1 = 1.25f;
double d2 = 4.58667435;
// printf("%f \t", f1);
printf("%.10f\n", f1 + d2);
// 整型与浮点型运算,整型转为浮点型
int n4 = 10;
double d3 = 1.67;
printf("%f", n4 + d3);
2.赋值过程中的自动类型转换
#include <stdio.h>
int main()
{
// 赋值 窄类型赋值给宽类型
int a1 = 10;
double a2 = a1;
printf("%f \n", a2);
// 赋值 宽类型赋值给窄类型
double b1 = 1.2;
int b2 = b1;
printf("%d", b2);
return 0;
}
3.强制类型转换(显式转换)
double d1 = 1.934;
double d2 = 4.2;
int num1 =(int)d1 + (int)d2; // d1转为1,d2转为4,结果是5
int num2 =(int)(d1 + d2); // d1+d2=6.134,6.134转为6
intnum3=(int)(3.5*10+6*1.5);//35.0+9.0=44.0->int=44
printf("num1=%d \n", num1);
printf("num2=%d \n", num2);
printf("num3=%d \n", num3);
//计算3个数字的平均数
int n1 = 12, n2 = 45, n3 = 19;
//先求和
int total = n1 + n2 + n3;
//用和除以数量
double avg = (double)total / 3;
printf("%d、%d、%d三个数字的平均数:%.2f", n1, n2, n3, avg);