C语言杂记——类型转换

博客介绍了C语言数据类型之间的强制转换。数据类型分为简单类型、结构类型、指针类型。强制转换有显式和隐式两种,隐式转换常见于赋值和数值计算,转换时要注意类型匹配。还给出了强制转换的一般规则,如字节数大小转换、有符号与无符号转换等。

数据类型之间的强制转换

数据类型

数据类型的分类有:简单类型、结构类型、指针类型三种。

  • 简单类型:int,folat,double,char,void,enum
  • 结构类型:数组,struct,union,class
  • 指针类型:*

数据类型

强制转换

强制转换分为显式转换和隐式转换,一般隐式转换回出现在赋值语句中和数值计算中,而显示转换比较明显,在转换是直接(转换类型)val即可。
在进行隐式转换时,要注意转换的类型是否匹配。
例如:

int a = 0;
float b = 1.0f;
a = b;

此时存储在a的只有b的整数部分,这样得到的结果不精准,有可能会导致错误。

强制转换的一般规则:

  • 字节数大的向字节数小的转换,会丢失高字节部分;
  • 字节数小的向字节数大的转换,高字节部分会填0;
  • 有符号与无符号之间的转换,看值域能否包含,若有符号的大于无符号,则转换成有符号;
  • 指针转换的值是其包含的地址;
	#include <stdio.h>
	#include <stdlib.h>
	#include <windows.h>
	#include <string.h>
	
	void main(void)
	{
		unsigned int    typeint    = 0xffff;
		unsigned char   typechar   = 0xff;
		float  typefloat  = 123.45;
		double typedouble = 123.456;
		unsigned int *p = &typeint;
		unsigned int pinot;
		unsigned int typeint2 = 100;
		unsigned char *pchar = &typechar;
		
		printf("%d,%d\n",typechar,typeint);
		printf("%d\n",sizeof(typeint)); 
		printf("%d\n",sizeof(typechar)); 
		typechar = (unsigned int)typechar;
		
		typeint  = (unsigned char)typeint;
		printf("%d,%d\n",typechar,typeint);
		typeint = (unsigned int)typefloat;
		typedouble = (double)typeint;
		printf("%d,%f\n",typeint,typedouble);
		printf("%d\n",&typeint);
		printf("%d,%d,%d,%d\n",*p,sizeof(unsigned int*),*p,p);
		pinot  = (unsigned int)p;
		printf("%d\n",pinot);
		
		p = &typeint2;	
		printf("%d\n",&typeint2);
		printf("%d,%d,%d,%d\n",*p,sizeof(unsigned int*),*p,p);
		pinot  = (unsigned int)p;
		printf("%d\n",pinot);
		typeint = 0xffff;
		typechar = 0xff;
		printf("hello C!\n");
	}
#include <stdio.h>
	#include <stdlib.h>
	#include <windows.h>
	typedef struct _DATA{
		int key;
		char *name;
		char date;
	}DATA,*pDATA;
	
	typedef struct _newDATA{
		int key;
		char *name;
	//	char date;
	}newDATA,*newpDATA;
	
	unsigned int fun1(pDATA pdata)
	{
		pDATA i;
	
		if(!(i = (pDATA)malloc(sizeof(DATA))))
		{
			return 0;
		}
		i->date = pdata->date;
		i->key = pdata->key;
		i->name = pdata->name;
		return (unsigned int)pdata;
	}
	
	void main(void)
	{
		DATA date1;
		DATA date2;
		newpDATA date3;
		unsigned int hdata;
		int a = 10;
		int *pa =&a;
		
		//char *str = "liminguang"; 
	
		date1.key = 100;
		date1.name = "liminguang";
		date1.date = 123;
	
		hdata = fun1(&date1);
		
		date3=(newpDATA)hdata;
		date2.key = date3->key;
		printf("date2.key = %d\n",date2.key);
		date3->key = 20;
		printf("date1.key = %d\n",date1.key);
		printf("&date1 = %p\n",&date1);
		printf("&date2 = %p\n",&date2);
		printf("date3 = %p\n",date3);
		printf("&date3 = %p\n",&date3);
		printf("hdata  = %d\n",hdata);
	
		printf("a = %d\n",a);
		printf("&a = %p\n",&a);
		printf("pa = %p\n",pa);
		printf("&pa = %p\n",&pa);
		printf("(int)pa = %d\n",pa);
	
		printf("hello C!\n");
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值