运算过程中数据格式变化对运算结果的影响与一维数组

本文详细介绍了数据类型转换的规则,包括自动转换、运算中的类型提升和降级,以及可能产生的溢出问题。此外,还讲解了数组的基本概念、初始化、元素赋值、边界安全以及数组传递。示例代码展示了浮点转整型导致的精度丢失和长型转短型的数据溢出情况。最后,文章提到了数组的排序操作及其实现。
摘要由CSDN通过智能技术生成

运算过程中数据格式的转变

迄今为止学到的几个数据类型:

整型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];    //将数据传回到主函数
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值