C语言总结1(数据类型)

1、数据类型
1.1、基本数据类型
数据类型分2类:基本数据类型+复合类型
基本类型:char short int long float double
复合类型:数组 结构体 共用体 类(C语言没有类,C++有)

1.1.1、内存占用与sizeof运算符
数据类型就好像一个一个的模子,这个模子实例化出C语言的变量。变量存储在内存中,需要占用一定的内存空间。一个变量占用多少空间是由变量的数据类型决定的。
每种数据类型,在不同的机器平台上占用内存是不同的。我们一般讲的时候都是以32位CPU为默认硬件平台来描述:

char 		1字节		8位
short 		2字节		16位
int 		4字节		32位
long 	  	4字节		32位
float 		4字节		
double		8字节	

练习题目:C语言中基本数据类型的变量内存占用,熟悉sizeof运算符的使用


#include <stdio.h>




int main(void)
{
	int len;
	
	len = sizeof(char);
	printf("sizeof(char) 	= %d.\n", sizeof(char));
	
	len = sizeof(short);
	printf("sizeof(short) 	= %d.\n", sizeof(short));
	
	len = sizeof(int);
	printf("sizeof(int) 	= %d.\n", sizeof(int));
	
	len = sizeof(long);
	printf("sizeof(long) 	= %d.\n", sizeof(long));
	
	len = sizeof(float);
	printf("sizeof(float) 	= %d.\n", sizeof(float));
	
	len = sizeof(double);
	printf("sizeof(double) 	= %d.\n", sizeof(double));
	
	return 0;
}

1.1.2、有符号数和无符号数
对于char short int long等整型类型的数,都分有符号有无符号数。
而对于floatdouble这种浮点型数来说,只有有符号数,没有无符号数。

对于C语言来说,数(也就是变量)是存储在内存中一个一个的格子中的。存储的时候是以二进制方式存储的。对于有符号数和无符号数来说,存储方式不同的。譬如对于int来说
unsigned int 无符号数,32位(4字节)全部用来存数的内容 所以表示的数的范围是
0 ~ 4294967295(2^32 - 1)
signed int 有符号数,32位中最高位用来存符号(0表示正数,1表示负数),剩余的31位用来存数据。所以可以表示的数的范围是
-2147483648(2^31) ~ 2147483647(2^31 - 1)

结论:从绝对数值来说,无符号数所表示的范围要大一些。因为有符号数使用1个二进制位来表示正负号。

1.1.3、整型数和浮点型数存储方式上的不同
对于floatdouble这种浮点类型的数,它在内存中的存储方式和整型数不一样。所以floatint相比,虽然都是4字节,但是在内存中存储的方式完全不同。所以同一个4字节的内存,如果存储时是按照int存放的,取的时候一定要按照int型方式去取。如果存的时候和取的时候理解的方式不同,那数据就完全错了。

备注:详细的数制存储可以查找资料:计算机原码、反码、补码等知识。

总结:存取方式上主要有两种,一种是整形,一种是浮点型,这两种存取方式完全不同,没有任何关联,所以是绝对不能随意改变一个变量的存取方式。在整型和浮点型之内,譬如说4种整型char、short、int、long只是范围大小不同而已,存储方式是一模一样的。float****和double存储原理是相同的,方式上有差异,导致了能表示的浮点型的范围和精度不同。
练习题目:C语言中整形和浮点型在内存中存储方式的不同,了解存储和取时数据类型必须相同的重要性

#include <stdio.h>


int main(void)
{
	int a;
	
	a = 123;

	printf("a = %d, a = %f.\n", a, a);		// a = 123, a = -0.032026.
	
	return 0;
}

/*
 * 运行结果:a = 123, a = -0.032026.
 * 解释:因为printf打印时,%d表示打印的是一个整形数,%f表示打印的是一个浮点数。
 * 我们实际传递a过去的时候,a是int型,所以相当于我们是以int型存储规则来存储的。
 * 然后打印的时候按照%f的方式去解析,实际相当于告诉编译器这个格子里存的是一个
 * 浮点数,于是编译器就按照浮点数的存储规则去取。所以取出来取出来的和存进去的完全
 * 不同。
 *
 */

1.2、空类型(关键字void)
C语言中的void类型,代表任意类型,而不是空的意思。任意类型的意思不是说想变成谁就变成谁,而是说它的类型是未知的,是还没指定的。
void * 是void类型的指针。void类型的指针的含义是:这是一个指针变量,该指针指向一个void类型的数。void类型的数就是说这个数有可能是int,也有可能是float,也有可能是个结构体,哪种类型都有可能,只是我当前不知道。

void型指针的作用就是,程序不知道那个变量的类型,但是程序员自己心里知道。程序员如何知道?当时给这个变量赋值的时候是什么类型,现在取的时候就还是什么类型。这些类型对不对,能否兼容,完全由程序员自己负责。编译器看到void就没办法帮你做类型检查了。

在函数的参数列表和返回值中,void代表的含义是:
一个函数形参列表为void,表示这个函数调用时不需要给它传参。
返回值类型是void,表示这个函数不会返回一个有意义的返回值。所以调用者也不要想着去使用该返回值。
练习题目:void test

#include <stdio.h>


void test(void);


int main(void)
{
/*
	test();
*/
	int a =  444;
	void *pVoid;
	
	pVoid = &a;
	
	printf("*pVoid = %d.\n", *(int *)pVoid);			// 对的		
	printf("*pVoid = %f.\n", *(float *)pVoid);			// 错误的
/*
 * 注意,void *类型的指针,可以指向任意类型的数。但是存放时和取时数的类型必须相同。如果不相同,编译器是没法发现的,结果无法预测
 */

	
	return 0;
}

// void类型参数和返回值,表示不需要
void test(void)
{
	printf("I am a void test.\n");
}

1.3、数据类型转换
C语言中有各种数据类型,写程序时需要定义各种类型的变量。这些变量需要参与运算。C语言有一个基本要求就是:不同类型的变量是不能直接运算的。也就是说,intfloat类型的变量不能直接加减等运算。你要运算,必须先把两种类型转成相同的类型才可以。

1.3.1、隐式转换
隐式转换就是自动转换,是C语言默认会进行的,不用程序员干涉。
C语言的理念:隐式类型转换默认朝精度更高、范围更大的方向转换。

1.3.2、强制类型转换
C语言默认不会这么做,但是程序员我想这么做,所以我强制这么做了。

练习题目:数据类型转换

#include <stdio.h>


int main(void)
{
	int a = 3;
	float b = 3.5;
	
	int c;
	
	c = a + b;
	printf("c = %d. \n", c);
/*
 * 结果:c = 6
 * 分析:
 * 1、编译器发现a和b类型不同,于是乎隐式类型转换,将a转成float类型的临时变量f1
 * 2、f1 + b,得到一个临时变量f2,值为float类型的6.500000
 * 3、c = f2,编译器发现c和f2的类型不相同,但是赋值时必须以 = 左边的类型为准,于是
 *    编译器隐式类型转换,将f2转成临时变量int型的i,值为6.
 * 4、printf打印时发现%d,右边的变量c类型为int,编译器检查发现类型匹配,直接打印。
 */

	
	
	
/*
	printf("a + b = %f.\n", a + b);		    // 6.500000
	printf("a + b = %d.\n", a + b);	     	// 0,float类型f2被当作int解析了,所以错
	printf("a + b = %d.\n", (int)(a + b));	// 	6
	printf("a = %d.\n", a);				    // 
*/
	
	return 0;
}

/*
 * 程序运行结果: a = b = 6.500000.
 * 逐步分析:
 * 1、编译器发现a+b中a和b的类型不同。这时候两个要加,编译器会进行隐式类型转换把两个
 *    转成类型相同。根据隐式类型转换的规则,编译器构造了一个临时变量(譬如叫
 * 	  float f1)然后把f1赋值为a转成float类型的值,之后参与运算时是用f1去和b相加的
 *    加完之后得到一个临时变量(譬如叫float f2).这个临时变量再参与之后的运算。
 *    题目中printf("a + b = %f.\n", a + b); printf中是%f,所以需要一个float类型的
 *    变量来打印。于是乎,f2直接拿去打印显示,得到结果6.500000
 */

1.4、C语言与bool类型
C语言中原生类型没有bool,C++中有。在C语言中如果需要使用bool类型,可以用int来代替。
很多代码体系中,用以下宏定义来定义真和假
#define TRUE 1
#define FALSE 0
练习题目:bool类型的使用

#include <stdio.h>

// 在bool类型的世界,除了0是假之外,其余数都是1,都是真

int main(void)
{
	int a;
	
	a = -222;
	
	if (a)
	{
		printf("a = %d.\n", a);
	}
	
	return 0;
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值