运算过程中数据格式的转变
迄今为止学到的几个数据类型:
整型int,
短整型short,
长整型long,
超长整型long long,
无符号型unsigned,
浮点float,
长浮点double,
字符char.
大部分的工作中都是使用同样的数据类型进行计算,但也不乏需要过程中要变数据类型的,因此需要掌握类型转换的规则。
1.当类型转换时,unsigned,signed,char,short自动转换为int,必要时会转变为unsigned int。float自动转换为double。
2.涉及两种类型的运算,两个值都会被分别转换为两种类型的更高级别。
3.类型级别的从高到低依次为:long double,double,float,unsigned long long,long long,unsighed long,long.unsigned int,int
4.在复制表达式语句中,计算的最终结果会被转换成被赋值变量的类型。这个过程可能导致类型升级或降级,降级可能导致数据溢出。
5.作为函数参数传递时,char,short自动转换为int,float自动变为double。
当转换的值与目标不匹配时:
1.目标类型是无符号整型,且待赋的值是整数时,额外的位将被忽略。例如,如果目标类型是8位unsigned char,待赋的值是原始值求模256
2.如果目标是一个有符号整型,待赋的值是整数,结果因实现而异。
3.如果目标类型是整型,待赋值位浮点数,该行为是未定义的。
把浮点型换成整数,原浮点值会被截断。(23.33→23,-24.1→-24)
例:
浮点转整型导致精度丢失:
float a =1.2;
unsigned short b=2;
short c;
c=(short)(a+b);
printf("%f\n",c); /*输出为0.000000,所有数位丢失*/
printf("%d\n",c); /*输出为3,小数位丢失*/
printf("%f\n",(float)c); /*输出为3.000000,小数位丢失*/
printf("%f\n",(a+b)); /*输出为3.200000*/
长型转短型导致数据溢出
一维数组
数组是内存里一组连续的同类型存储区。
数组可用于合并多个存储区。
例:
int arr[5]={0};
int arr_int[]={10,11,12,13,14,15};
int——数组元素的类型
arr——数组的名称
5——数组元素个数
数组由数据类型相同的一系列元素组成。在使用数组时,通过声明
数组初始化
什么叫初始化?给元素赋值即可
例:↓
int arr[5]={0}
给数组元素赋值
数组边界
使用数组时,防止数组下标超出边界。例:
int arr[20] /*要确保下标在0~19之间*/
由于编译器在超出范围时不报错(但会发出警告)。
调整数组中的数据
char array[5]={0}; /*初始化*/
int i;
for(i=0;i<5;i++) /*编辑循环规则*/
{
array[i]=array[i]+65+i; /*给各个元素赋值直到循环结束*/ //65 == 'A'
printf("%c\t",array[i]); /*输出数组*/
printf("单个数据的地址为%p\t",&array[i]); /*输出元素地址*/
printf("数据占用的空间%dbyte\n",sizeof(array[i])); /*输出元素的空间*/
}
数组传递
#include<stdio.h>
int main()
{
int array[8]={0}; /*数组初始化*/
int i;
for(i=0;i<8;i++) /*制定循环规则*/
cal(array,8); /*主调函数中调用规则:被调函数名(cal)(实参数组名array)(实参数组大小8)*/
// printf("log:%d\n",array[i]);
return 0;
}
int cal(int array[],int j) /*被调函数规则:被调函数名(形参函数名,形参函数大小j)*/
{
int i;
for(i=0;i<j;i++)
{
array[i]=array[i]+i+10*(i+1);
printf("log:%d\n",array[i]);
}
return array[i];
}
数据逆置
#include<stdio.h>
int main()
{
int arr[5]={1,2,3,4,5};
int i;
for(i=0;i<5;i++)
printf("排序前:arr[%d]= %d\n", i, arr[i]);
printf("\n");
sort(arr,5);
for(i=0;i<5;i++)
printf("排序后:arr[%d]= %d\n", i, arr[i]);
return 0;
}
int sort(int arr_01[],int n)
{
int i,j;
for(j=0;j<n-1;j++) //比较轮数
// for(i=0;i<n-1;i++) //每轮的每个元素逐个比较
{
for(i=0;i<n-j-1;i++)
{
int temp;
if(arr_01[i]<arr_01[i+1])
{
temp=arr_01[i+1];
arr_01[i+1]=arr_01[i];
arr_01[i]=temp;
}
}
}
return arr_01[i]; //将数据传回到主函数
}