【C】C语言数据类型与变量 (看了就懂版)

C语言数据类型与变量

—————————————————————————————————————————————

数据类型介绍:

C语言提供了丰富的数据类型来描述生活中的各种数据。
使用整型类型来描述整数,使用字符类型来描述字符,使用浮点型类型来描述小数
所谓“类型”,就是相似的数据所拥有的共同特征,编译器只有知道了数据的类型,才知道怎么操作数据

数据类型分为两大类:

内置类型

1.字符型
2.整型
3.浮点型
4.布尔类型

自定义类型

1.数组
2.结构体(struct)
3.枚举(enum)
4.联合体(union)
—————————————————————————————————————————————

字符型
char   //character
[signed] char   //有符号 
unsigned char   //无符号 
整型
//integer
//短整型
short [int]
[signed] short [int]
unsigned short[int]
//整型
int
[signed] int
unsigned int
//长整型
long [int]
[signed] long [int]
unsigned long [int]
//更长的整型
long long [int]
[signed] long long [int] 
unsigned long long [int]

[ ]内的内容可省略

浮点型
float//单精度
double//双精度
long double
布尔类型
_Bool(bool)

C语言原来并没有为布尔值单独设置一个类型,而是使用整数0表示假,非零值表示真
在C99 中也引入了布尔类型,是专门表示真假的, true真false假

布尔值的使用必须包括头文件<stdbool.h>
—————————————————————————————————————————————

各种数据类型的长度

sizeof操作符

sizeof 是一个关键字,也是操作符,专门是用来计算sizeof的操作符数的类型长度的,单位是字节
sizeof 操作符的操作数可以是类型,也可是变量或者表达式

sizeof(类型)
sizeof 表达式

sizeof 的操作数如果不是类型,是表达式的时候,可以省略掉后边的括号
sizeof 后边的表达式不真实参与运算,根据表达式的类型来得出大小

sizeof 的计算结果是size_t类型的, 打印使用%zd,为无符号整数

sizeof 运算符的返回值,C语言只规定是无符号整数,并没有规定具体的类型,而是留给系统自己去决定,sizeof 到底返回什么类型。
不同的系统中,返回值的类型有可能是unsigned int,也有可能是 unsigned long,甚至是unsignedlong long,对应的printf() 占位符分别是%u、%lu和 %llu,这样不利于程序的可移植性。

C语言提供了一个解决方法,创造了一个类型别名size_t,用来统一表示sizeof的返回值类型。对应当前系统的 sizeof 的返回值类型,可能是unsigned int,也可能是unsigned long long.

用sizeof求数据类型的长度:

#include <stdio.h>
int main(){
	printf("%zd\n",sizeof(char));
	printf("%zd\n",sizeof(_Bool)); 
	printf("%zd\n",sizeof(short)); 
	printf("%zd\n", sizeof(int));
	printf("%zd\n", sizeof(long));
	printf("%zd\n", sizeof(long long));
	printf("%zd\n", sizeof(float));
	printf("%zd\n",sizeof(double));
	printf("%zd\n", sizeof(long double));
return 0;
}

在这里插入图片描述

计算机的常见单位

最小的单位:bit 比特 ———存储一个二进制位需要的空间
1字节=8bit
char —1个字节
bool —1个字节
short —2个字节
int —4个字节
long —4个字节 // sizeof(long)>=sizeof(int)
float —4个字节
long long—8个字节
double—8个字节
long double—16个字节 // sizeof(long double)>=sizeof(double)

#include <stdio.h>
int main(){
	int a=10;
	short s=5;
	printf("%zd\n",sizeof(s=a+2));
	printf("%d\n",s); 

return 0;
}

在这里插入图片描述
可以看出,sizeof(s=a+2)并未改变s的值,s仍为5

那么,电脑是如何处理sizeof(s=a+2)的呢?
a+2————int+int ,结果仍为int
将a+d结果赋值给s,就是将int类型转化为short类型,中间发生了截断,最终结果取决于s的数据类型
—————————————————————————————————————————————

signed和unsigned

signed 关键字,表示一个类型带有正负号,包含负值;
unsigned关键字,表示该类型不带有正负号,只能表示零和正整数

对于 int类型,默认是带有正负号的,也就是说int等同于 signed int.

signed int a;//等同于int a;

int 类型也可以不带正负号,只表示非负整数。这时就必须使用关键字unsigned声明变量。

unsigned int a;

整数变量声明为unsigned的好处是,同样长度的内存能够表示的最大整数值,增大了一倍
比如,
16位的 signed short int的取值范围是:-32768~32767,最大是32767;
而unsigned short int 的取值范围为:0~65535,最大值为65535

既然int与signed int是一样的,那么char和signed char是否一样呢?
答案是不确定
C语言并没有规定char=signed char

那么char到底是有符号的还是没有符号的?
char有无符号取决于编译器
—————————————————————————————————————————————
%d用来打印有符号整型
%u用来打印无符号整型

#include <stdio.h>
int main()
{
	signed int num1=-100;	
 	unsigned int num2=100;	
 	printf("%d\n", num1);
	printf("%u\n", num2);
	return 0;
}

在这里插入图片描述

数据类型的取值范围

每一种数据类型有自己的取值范围,也就是存储的数值的最大值和最小值的区间,有了丰富的类型,我们就可以在适当的场景下去选择适合的类型

如果要查看当前系统上不同数据类型的极限值:
limits.h 文件中说明了整型类型的取值范围
float.h 这个头文件中说明浮点型类型的取值范围

为了代码的可移植性,需要知道某种整数类型的极限值时,应该尽量使用这些常量。·

SCHAR_MIN,SCHAR_MAX : signed char的最小值和最大值

SHRT_MIN, SHRT_MAX : short的最小值和最大值

INT_MIN, INT_MAX : int的最小值和最大值

LONG_MIN,LONG_MAX : long 的最小值和最大值

LLONG_MIN,LLONG_MAX:long long 的最小值和最大值

UCHAR_MAX: unsigned char的最大值

USHRT_MAX : unsigned short的最大值

·UINT_MAX : unsigned int的最大值

·ULONG_MAX: unsigned long 的最大值

·ULLONG_MAX: unsigned long long 的最大值

________________________________________________________________________________-

变量

类型是用来创建变量的:
数据类型 变量名;

初始化——在变量创建的同时,给一个初始值
数据类型 变量名=值;

int a=0;
char ch='w';

变量的分类

全局变量:在大括号外部定义的变量就是全局变量
全局变量的使用范围更广,整个工程中想使用,都是有办法使用的
局部变量:在大括号内部定义的变量就是局部变量
局部变量的使用范围是比较局限,只能在自己所在的局部范围内使用的

int b = 20;//全局变量
int main()
{
	int a= 10;//局部变量
	{
		int c=100;//局部变量
	}
	return 0;
}

若全局变量与局部变量都可以使用,全局变量和局部变量名字相同时,优先使用局部变量

int b = 20;//全局变量
int main()
{
	int b= 10;//局部变量
	{
		printf("%d",b);
	}
	return 0;
}

在这里插入图片描述

若此时想使用全局变量,在C++中可以这么表示:

#include <iostream>
using namespace std;
int b = 20;//全局变量
int main()
{
	int b= 10;//局部变量
	{
		printf("%d",::b);
	}
	return 0;
}

在这里插入图片描述
全局变量和局部变量在内存中存储在哪里呢?
一般我们在学习C/C++语言的时候,我们会关注内存中的三个区域:栈区、堆区、静态区。

1.局部变量是放在内存的栈区
2.全局变量是放在内存的静态区
3.堆区是用来动态内存管理的

变量创建的本质是在内存中申请空间在这里插入图片描述``

int b;//全局变量不初始化,默认会被编译器初始化为0
int main()
{
	int a;//局部变量不初始化,值是随机的	
	printf("%d\n",a);	
	return 0
}

ps:假期过去了,又又又开学了且没有假期…
虽然更新较慢,但还是会持续更新的!
每日一句

如果痛恨所处的黑暗,请你成为你自己想要的光
梦想本身也不会发光,
发光的,
是追梦的你…

早上好!!

我依旧我故我,我在每个清晨新生…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值