数据类型的相互转换
首相强调一下那个关于各类型数值的长度以及取值范围的表格十分重要,必须附上:
类型 关键字 长度(位) 取值范围
有符号字符型 【signed】char 8 -128–127
无符号字符型 unsigned char 8 0–255
有符号短整形 【signed】short [int] 16 -32768–32767
无符号短整形 unsigned short [int] 16 0-65535
有符号长整形 【signed】long [int] 32 -2^31–2^31-1
无符号长整形 unsigned long [int] 32 0–2^32-1
单精度实行 float 64 -2^63–2^63-1
双精度实行 float 64 0–2^64-1
溢位的情况:
#include <stdio.h>
void main(){
int c = 4294967295; //int的最大值 2^32 - 1
printf("%d",c+1);
getchar();
}
// 0 (如果是加3就打印2,很好理解溢出的规则:一旦溢出就会从取值范围的最小值开始重新计数。)
char b = ‘10’;
char c = 10;
printf(“%b,%c”,b,c);
这两者的区别在于:
加引号则当做字符显示,但是只认一位,并且是最后一位,所以打印b显示结果为0.(值部分如果是不带引号的字母,编译器会直接提示错误)
不加引号的数字则默认为ASCII码,而10在ASCII码中对应的是HT (horizontal tab),执行的横向缩进。所以会发现光标后移四格,但不打印任何东西,所以不要觉得奇怪哦!
不同类型数据间的混合运算与类型转换:
①若参与运算量的类型不同,则先转换成同一类型,然后进行运算
②转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int量转成long型后再进行运算
a、若两种类型的字节数不同,转换成字节数高的类型
b、若两种类型的字节数相同,且一种有符号,一种无符号,则转换成无符号类型
③所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算
④char型和short型参与运算时,必须先转换成int型
⑤在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度左边长时,将丢失一部分数据,这样会降低精度,丢失的部分按四舍五入向前舍入
#include <stdio.h>
void main(){
short b = 7;
int c = 8;
printf("%d",sizeof(b+c));
getchar();
}
//4 说明b被转换成了4字节的int型。
...
#include <stdio.h>
void main(){
char i = '10';
int a = 100;
printf("%d",i+a);
getchar();
}
// 148 char i='10'对应的是数字0的ASCCI码,把i换成M结果就是177
强制类型转换一般格式如下:
(类型名)(表达式)
这种强制类型转换操作并不改变操作数本身
第三,我也不知道叫什么,反正就是大转小,小转大,最值得倒腾的就是这一部分的内容,颇有趣味。
结合内存空间来理解,小的转大的,内存显示时高位补0就可以。大的转小的就有可能会有精度损失。
//大转小,int转short,实例:
#include <stdio.h>
void main(){
int i =4000000000;
short j = i;
printf("%d",j);
getchar();
}
//4亿是int型,它有32位,在内存里用二进制显示为:1110 1110 0110 1011 0010 1000 0000 0000 当把它赋值给short型的j时,将从32位变为16位,高位往低位数的16位全部损失。内存里面显示的结果为:0010 1000 0000 0000,即10240
再来一题:
#include <stdio.h>
void main(){
int i ;
i = 1.2;
printf("%d",i);
getchar();
}
//结果为1,这个题目的坑就在于直接将一个float型的数值1.2赋给了i,等号也是运算符,也就是说这里涉及到了不同类型数值的运算,既然如此就得遵循隐式规则,小从大,也就是说1.2要自动变为Int型的1,所以i的值仍然是1.为了方便理解,可以用将代码改为float j = 1.2; i = j;这样就很好理解了。
带负数的求余:
printf(“%d”,3%-5) //3 3 = 0*-5+3
printf(“%d”,5%-3) //2 5 = -1*-3+2
printf(“%d”,-3%-5) //-3 -3 = 0*5-3
printf(“%d”,-5%3) //-2 -5 = -1*-3-2
总结规律:余数不可以与被除数的符号相反,商的绝对值不可以大于除数。
scanf 表示输入与printf对应:
题目:交换十位与个位
int num,i,j;
scanf(“%d”,&num); // scanf(格式控制,地址表)
i = num/10;
j = num%10;
num = 10*j + i;
printf(“%d”,num);
//运行以后在指令框随便输入一个两位数比如78,会在下一行显示结果87
//输入大写,反馈小写
#include <stdio.h>
void main(){
char a,j;
scanf("%c",&a);
j =a + 32;
printf("%c",j);
getchar();
}
赋值运算符的加强练习:
int a =3;
printf(“%d”,-(++i)) //-4
逗号运算符:
(a = 3*5,a*4),a+5 //a=15,60,20
问号表示的嵌套:
int a = 5;
int b = 6;
int c = 7;
int d = 8;
int f = a>b?a:c>d?c:d //可以改写为a>b?a:(c>d?c:d)
printf(“%d”,f); //8
课件:
1,输入一三位个数,显示个十百位相加的结果
#include <stdio.h>
void main(){
int i,j,n,f,num;
scanf("%d",&num);
i = num/100;
j = (num%100)/10;
n = num-i*100-j*10;
f = i + j + n;
printf("%d",f);
getchar();
} //结果演示 输入123 回车 显示6
Math.h函数里面所有的可用的函数
1 三角函数
double sin (double);
double cos (double);
double tan (double);
2 反三角函数
double asin (double); 结果介于[-PI/2, PI/2]
double acos (double); 结果介于[0, PI]
double atan (double); 反正切(主值), 结果介于[-PI/2, PI/2]
double atan2 (double, double); 反正切(整圆值), 结果介于[-PI/2, PI/2]
3 双曲三角函数
double sinh (double);
double cosh (double);
double tanh (double);
4 指数与对数
double exp (double);
double sqrt (double);
double log (double); 以e为底的对数
double log10 (double);
double pow(double x, double y)//计算以x为底数的y次幂
5 取整
double ceil (double); 取上整
double floor (double); 取下整
6 绝对值
double fabs (double);
double cabs(struct complex znum) //求复数的绝对值
7 标准化浮点数
double frexp (double f, int p); 标准化浮点数, f = x 2^p, 已知f求x, p ( x介于[0.5, 1] )
double ldexp (double x, int p); 与frexp相反, 已知x, p求f
8 取整与取余
double modf (double, double*); 将参数的整数部分通过指针回传, 返回小数部分
double fmod (double, double); 返回两参数相除的余数
9其他
double hypot(double x, double y);//已知直角三角形两个直角边长度,求斜边长度
double ldexp(double x, int exponent);//计算x*(2的exponent次幂)
double poly(double x, int degree, double coeffs [] )//计算多项式
nt matherr(struct exception *e)//数学错误计算处理程序
source: 《C & C++ Code Capsules》