1. 基本数据类型
原码 反码和补码
正数的反码是其本身
负数的反码是在其源码的基础上,符号位不变,其余各个位取反
负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后+1
1.1整数类型
int 占用4个字节 32个比特
long 占用8个字节 64个比特
short 占用2个字节 16个比特
1.2浮点类型
浮点类型一般用于保存小数,不过为啥不叫小数类型而选浮点类型呢?因为我们的一个小数分为整数部分和小数部分,我们需要用一部分的bit位去表示整数部分,而另一部分去表示小数部分,至于整数部分和小数部分各自占多少并不是固定的,而是浮动类型决定的
float 单精度浮点 占用4个字节 32个比特
double 双精度浮点 占用8个字节 64个比特
1.3字符类型
char 占用1个字节 (-128-127)可以表示所有的ASCll码的字符 每一个数字对应的是编码表中的一个字符
编码表包含所有的常见的字符 ,包括运算符号 数字 大小写字母等
2.变量
小知识:C语言变量的生命周期和作用域
变量类型 | 生存周期 | 作用域 |
局部变量 | auto:自动变量,离开定义函数立即消失 | 只作用于该函数内部 |
register:寄存器变量,离开定义函数立即消失 | ||
static:静态变量,离开定义函数仍然存在 | ||
全局变量 | 在程序运行期间一直存在 | static:静态变量,仅限于本文件内部条用 |
extern:外部存储变量,用于声明本文件将要用到的其他文件的变量 |
前面我们了解了C语言中的基本类型,那么我们如何使用呢?这时我们就可以创建不同类型的变量了。
2.1变量的使用
变量就像我们在数学中学习的x,y,z一样,我们可以直接声明一个变量,并利用这些变量进行基本的运算,声明变量的格式为:
数据类型 变量名称 = 初始值 //其中初始值可以不用在定义变量时设定
// = 是赋值操作,可以将等号后面的值赋值给前面的变量,等号后面可以直接写一个数字(常量)、变量名称,算式
比如我们现在想要声明一个整数类型的变量:
int a = 10; //变量类型为int(常用),变量名称为a,变量的初始值为10;
int a = 10,b = 20; //多个变量可以另起一行编写,也可以像这样用逗号隔开,注意类型必须是一样的
其中,变量的
不能以数字开头,不能重复使用
不能使用关键字,可以包含数字但是不能数字开头
注意变量一定要先声明再使用
float 单精度浮点数 4个字节,32bit
double 双精度浮点数 8个字节,64bit
#include <stdio.h>
int main() {
double a;
a = 0.5;
int b = 2;
int c = a + b;
printf("a=%f, b=%d, c=%d", a , b, c);
return 0;
}
#include <stdio.h>
int main() {
double a = 3.5 ;
float b = 4.5 ;
printf("a = %f, b = %lf ", a ,b );
return 0;
}
void main() {
int a=1;// 定义了一个整型变量,取名为a, 并赋值为1 (强数据类型语言)
int b=3;// 定义了一个整型变量,取名为b, 并赋值为3
b=89;// 给变量赋值 为 89
printf("a=%d \n",a);// 使用输出语句,把变量a 值输出 %d 表示输出的形式为整数
printf("b=%d \n", b);//使用输出语句,把变量b 值输出 %d 表示输出的形式为整数
getchar(); //将控制台停留,等待输入
}
- 声明变量int num;
- 赋值num = 60;
- 使用printf("num=%d", num);
- 也可以一步到位 : int num2 = 99;
//1.声明变量【告诉计算机要开一个房间】
int num = 1 ; //整型
double score = 2.3; //小数
char gender = 'A'; //字符
char name[] = "尚硅谷"; //字符串
变量使用注意事项
- 变量表示内存中的一个存储区域(不同的数据类型,占用的空间大小不一样)
- 该区域有自己的名称 和类型
- 变量必须先声明,后使用
- 该区域的数据可以在同一类型范围内不断变化
- 变量在同一个作用域内不能重名
- 变量三要素 (变量名+值+数据类型) ,这一点请大家注意。
常量:
C语言中的常量
C编程中的常量是一些固定的值,它在整个程序运行过程中无法被改变。
字面常量
字面常量是直接写出的固定值,它包含C语言中可用的数据类型,可分为整型常量,字符常量等。如:9.9,“hello”等就属于这一类常量。
##const修饰的常变量
有的时候我们希望定义这么一种变量:值不能被修改,在整个作用域中都维持原值。为了满足用户需求,C语言标准提供了_const_关键字。在定义变量的同时,在变量名之前加上_const_修饰。如下所示:
int main() { const int a = 1; // const修饰的常变量 }
- const修饰的常变量,本质上是变量。
- 但具有常属性,不能被修改。int main() { const int a = 1; a = 2; // 错误 const int n = 20; int arr[n] = { 0 }; //n本质上是变量 } 关于上述n的使用,需要说明的是:在C99标准之前,数组的大小只能是常量修饰,不支持变长数组。
#define定义的标识符常量
C语言提供了***#define***命令定义标识符常量,该标识符常量在程序中是个定值,通常用于代表数组容量或涉及数学的常量等。如:
#define PI 3.14159 #define SIZE 10 // 此处SIZE代表数组元素个数 int main() { int arr[SIZE]={0}; return 0; }
如需修改数组大小,只需将SIZE所代表的值修改即可,十分方便。
枚举常量
日常生活中有一些代表实际意义的常量,有这么一个特点:数值较小且为非负整数。如一周有7天等。C语言提供了一种枚举(Enum)类型,能够列出所有可能会用到的取值,并给它们取一个名字。
int main() { enum Sex { //枚举常量 性别 MALE, FEMALE, SECRET }; enum Sex s = FEMALE; //利用枚举常量给变量赋值 printf("%d\n", MALE); printf("%d\n", FEMALE); printf("%d\n",SECRET); return 0; }
在使用枚举常量的时候,需要注意以下几点:
- 不能对枚举常量赋值,只能将它们的值赋给其他的变量。
- 不能再定义与枚举常量名字相同的变量。
- 不能用&取得它们的地址。
以上就是C语言中常见的几种常量,合理使用常量可以使程序可读性更强,条理清晰,易于维护。
2.2无符号数
我们知道,所有的数据底层都是采用二进制来进行保存的,而第一位则是用于保存符号位,但是如果我们不考虑这个符号位,那么所有的数都是按照正数来表示,比如考虑了符号位的char类型;
考虑符号表示范围:-128~127
不考虑符号:0~255
我们也可以直接使用这些不带符号位的数据类型
#include <stdio.h>
#include "string.h"
int main()
{
unsigned char c=-65;
printf("%u",c);
}
可以看到这里给了无符号char类型c一个-65的值,但是现在很明显符号位也是作为数值的表示部分,所以结果肯定不是-65;
结合我们前面学习的基础知识,我们来看看为什么得到的是191这个数字。首先char类型占据一个字节,8个bit位
00000000 -> 现在赋值-65 -> -65的补码形式 -> 10111111
由于现在没有符号位,一律都是正数,所以,10111111 = 128+32+16+8+4+2+1 = 191
我们也可以直接以无符号数的形式打印:
#include <stdio.h>
#include "string.h"
int main()
{
int i = -1;
printf("%u",i);
}
得到无符号int的最大值
2.3类型转换
一种类型的数据可以转换为其他类型的数据,这种操作我们称为类型转换,类型转换分为自动类型转换和强制类型转换,比如我们现在希望将一个short类型的数据转换为int类型的数据
#include <stdio.h>
int main() {
short s = 10;
int i = s; //直接将s的值传递给i即可,但是注意此时s和i的类型不同
}
这里其实就是一种自动类型转换,自动类型转换就是编译器隐式地进行的数据类型转换,这种转换不需要我们做什么,我们直接写就行,会自动进行转换操作
float a = 3;//包括这里我们给的明明是一个int整数3但是却可以赋值给
float类型,说明也是进行了自动类型转换
如果我们使用一个比特换的类型最大值都还要大的值进行类型转换,比如:
#include <stdio.h>
int main() {
int a = 511;
char b = a ; //最大127
printf("%d",b);
}
#include <stdio.h>
int main() {
double b = 3.74 ;
int i = b ;
printf("%d", i);
}
- 不同的类型优先级不同(根据长度而定)
- char和short类型在参与运算时一律转换为int再进行运算
- 浮点类型默认按双精度进行计算,所以就算有float类型,也会转换为double类型参与计算
- 当有一个更高优先级的类型和一个低优先级的类型同时参与运算时,统一转换为高优先级运算,比如int和long参与运算,那么int转换为long再算,所以结果也是long类型,int和double参与运算,那么先把int转换为double再算
备注:如有错误,请谅解!
此文章为本人学习笔记,仅供参考!如有重复!!!请联系本人