数据类型介绍
C语⾔提供了丰富的数据类型来描述⽣活中的各种数据。使⽤整型类型来描述整数,使⽤字符类型来描述字符,使⽤浮点型类型来描述⼩数。所谓“类型”,就是相似的数据所拥有的共同特征,编译器只有知道了数据的类型,才知道怎么操作数据。
字符型
char //character
[signed]char//有符号的
unsigned char//无符号的
整型
//短整型
short[int]
[signed] short [int]
unsigned short [int]
//整型
int
[signed] int
unsigned int
//长整型
long
[signed] long [int]
unsigned long [int]
//更长的整型
long long [int]
[signed] long long [int]
unsigned long long [int]
浮点型
float
double
long double
布尔类型
C语⾔原来并没有为布尔值单独设置⼀个类型,⽽是使⽤整数 0 表⽰假,⾮零值表⽰真。 在 C99 中也引⼊了 布尔类型 ,是专⻔表⽰真假的。
_Bool
布尔类型的使用必须包含头文件<stdbool.h>,布尔类型变量的取值是:true或者false
各种数据类型的⻓度
每⼀种数据类型都有⾃⼰的⻓度,使⽤不同的数据类型,能够创建出⻓度不同的变量,变量⻓度的不同,存储的数据范围就有所差异。
sizeof操作符
sizeof 是⼀个关键字,也是操作符,专⻔是⽤来计算sizeof的操作符数的类型⻓度的,单位是字节。sizeof 操作符的操作数可以是类型,也可是变量或者表达式。
1 sizeof( 类型 )
2 sizeof 表达式
sizeof 的操作数如果不是类型,是表达式的时候,可以省略掉后边的括号的。
sizeof 后边的表达式是不真实参与运算的,根据表达式的类型来得出⼤⼩。
sizeof 的计算结果是size_t 类型的
int main() {
int a = 10;
printf("%zd\n", sizeof(a));
printf("%zd\n", sizeof a);
printf("%zd\n", sizeof(int));
printf("%zd\n", sizeof(3 + 3.5));
return 0;
}
数据类型的长度
int main() {
printf("%zd\n", sizeof(short));
printf("%zd\n", sizeof(char));
printf("%zd\n", sizeof(_Bool));
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;
}
signed和unsigned
C语言使用signed和unsigned修饰整形和字符型,signed可以带负号,unsigned不带负号,只能表示零和正整数,int默认是带有正负号的,int等同signed int,一般情况下signed默认不写。整数变量为unsigned时,同样长度的内存能够表示的整数值,增大了一倍。limits.h的相关定义
#define SHRT_MIN (-32768) //有符号16位整型的最⼩值
#define SHRT_MAX 32767 //有符号16位整型的最⼤值
#define USHRT_MAX 0xffff //⽆符号16位整型的最⼤值
#define INT_MIN (-2147483647 - 1) //有符号整型的最⼩值
#define INT_MAX 2147483647 //有符号整型的最⼤值
变量
了解清楚了类型,我们使⽤类型做什么呢?类型是⽤来创建变量的。 什么是变量呢?C语⾔中把经常变化的值称为变量,不变的值称为常量。变量创建的语法形式是这样的
data_type name;
| |
| |
数据类型 变量名
int age; //整型变量
char ch; //字符变量
double weight; //浮点型变量
变量在创建的时候就给⼀个初始值,就叫初始化
int age = 18;
char ch = 'w';
double weight = 48.0;
unsigned int height = 100;
变量的分类
• 全局变量:在⼤括号外部定义的变量就是全局变量全局变量的使⽤范围更⼴,整个⼯程中想使⽤,都是有办法使⽤的。
• 局部变量:在⼤括号内部定义的变量就是局部变量局部变量的使⽤范围是⽐较局限,只能在⾃⼰所在的局部范围内使⽤的。
int global = 2024;
int main() {
int local = 2025;
printf("%d\n", global);
printf("%d\n", local);
return 0;
}
如果局部变量和全局变量名字相同呢?
int n = 10;
int main() {
int n = 100;
printf("%d\n", n);
return 0;
}
当全局变量和局部变量同名时,优先使用的是局部变量的值。
全局变量和局部变量在内存中存储在哪⾥呢?
内存中的三个区域:栈区、堆区、静态区。
- 局部变量是放在内存的栈区
- 全局变量是放在内存的静态区
- 堆区是⽤来动态内存管理的
算术操作符:+、-、*、/、%
+和-
- 和 - ⽤来完成加法和减法。
- 和 - 都是有2个操作数的,位于操作符两端的就是它们的操作数,这种操作符也叫双⽬操作符
int main() {
int x = 4 + 22;
int y = 61 - 23;
printf("%d\n", x);
printf("%d\n", y);
return 0;
}
乘号*
运算符 * ⽤来完成乘法。
int main() {
int num = 6;
printf("%d\n", num * num);
return 0;
}
/
运算符 / ⽤来完成除法。
除号的两端如果是整数,执⾏的是整数除法,得到的结果也是整数。
int main() {
float x = 6 / 4;
int y = 6 / 4;
printf("%f\n", x);
printf("%d\n", y);
return 0;
}
尽管变量 x 的类型是 float (浮点数),但是6 / 4 得到的结果是1.0 ,⽽不是 1.5 。原因就在于C语⾔⾥⾯的整数除法是整除,只会返回整数部分,丢弃⼩数部分。如果希望得到浮点数的结果,两个运算数必须⾄少有⼀个浮点数,这时C语⾔就会进⾏浮点数除法。
int main() {
float x = 6.0 / 4;
int y = 6 / 4;
printf("%f\n", x);
printf("%d\n", y);
return 0;
}
下面这段程序的score数值应该是多少,是25还是0,实际上score等于0,因为score/20是整除,会得到整数值0,所以score乘100得到也是0。如果想得到预想的结果,可以吧20改为20.0,变成浮点数除法。
int main() {
int score = 5;
score = (score / 20) * 100;
printf("%d\n", score);
return 0;
}
%
运算符 % 表⽰求模(余)运算,即返回两个整数相除的余值。这个运算符只能⽤于整数,不能⽤于浮点数。
int main() {
int i = 6 % 4;
printf("%d\n", i);
return 0;
}
负数求模的规则是,结果的正负号由第⼀个运算数的正负号决定。
int main() {
printf("%d\n", 6 % 4);
printf("%d\n", -6 % 4);
printf("%d\n", 6 % -4);
printf("%d\n", -6 % -4);
return 0;
}
赋值操作符:=和复合赋值
在变量创建的时候给⼀个初始值叫初始化,在变量创建好后,再给⼀个值,这叫赋值。
int a = 100;
a = 200;
连续赋值
赋值操作符也可以连续赋值,如
int a = 3;
int b = 5;
int c = 0;
c = b = a + 3;
复合赋值符
在写代码时,我们经常可能对⼀个数进⾏⾃增、⾃减的操作,如下代码:
int a = 10;
a += 3;
a -= 2;
单⽬操作符:++、–、+、-
++和–
++是⼀种⾃增的操作符,⼜分为前置++和后置++,–是⼀种⾃减的操作符,也分为前置–和后置–
前置++
int a = 10;
int b = ++a;
printf("%d\n",a,b);
计算⼝诀:先+1,后使⽤;
后置++
int a = 10;
int b = a++;
printf("%d\n",a,b);
计算⼝诀:先使⽤,后+1;
前置–和后置–和上述原理一致。
强制类型转换
在操作符中还有⼀种特殊的操作符是强制类型转换,语法形式很简单,形式如下:
int a = (int)3.14;