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:假期过去了,又又又开学了且没有假期…
虽然更新较慢,但还是会持续更新的!
每日一句
如果痛恨所处的黑暗,请你成为你自己想要的光
梦想本身也不会发光,
发光的,
是追梦的你…
早上好!!
我依旧我故我,我在每个清晨新生…