个人主页: 流年如夢
专栏: 《C语言》
文章目录
- 一数据类型介绍
- 1.思维导图
- 2.类型介绍
- 二.了一下解`signed`和`unsigned`
- 三.数据类型的取值范围
- 1.整型(integer)
- 2.浮点型(Floating-Point)
- 3.取值范围的计算方法
- 4.代码验证取值范围
- 四.变量
- 1.变量的定义
- 2.数据类型
- 3.变量的命名规则
- 4.全局变量和局部变量
- 五.了解操作符
- 1.算术操作符
- 2.赋值操作符
- 3.单目操作符
- 六.强制类型转换
- 七.scanf和printf的介绍
- 八.ASCLL码表参考
一数据类型介绍
1.思维导图
2.类型介绍
字符型:
char、[signed]、unsigned char;("signed"为有符号整数类型)
短整型:short、[signed] short、unsigned short;
整型:int、[signed] int、unsigned int;
长整型:long、[signed] long、unsigned long;
长长整型:longlong、[signed] long long、unsigned long;
浮点型:float、double、long doouble;
布尔类型:_Bool(头文件为stdbool.h)
简单布尔类型代码示意#include<stdio.h>#include<stdbool.h>intmain(){bool flag=true;if(flag){printf("I Love C\n");}return0;}其中,布尔类型变量的取值为true和false,true=1,为真;false=0,为假,通过两者来判断。
关于数组、结构体、枚举等作者会在学完后进行整理逻辑在发😊
二.了一下解signed和unsigned
在 C 语言中,signed和unsigned是用于修饰整数类型的关键字,主要区别在于如何表示负数以及取值范围。
1. 有符号类型(signed)
有符号类型能够表示正数、负数以及零。它借助二进制的最高位(也就是符号位)来确定数值的正负。当符号位为 0 时,表示这个数是正数;当符号位为 1 时,则表示这个数是负数。
常见的有符号类型:像int、short、long等。
表示范围:以 8 位有符号整数为例,其表示范围是-128 到 127(即 -2⁷ 到 2⁷ - 1)。
2. 无符号类型(unsigned)
无符号类型只能表示正数和零,因为它没有符号位,所有的二进制位都用来表示数值的大小。
常见的无符号类型:例如unsigned int、unsigned short、unsigned char等。
表示范围:同样以 8 位无符号整数来说,它的表示范围是0 到 255(也就是 0 到 2⁸ - 1)。
代码示例:#include<stdio.h>intmain(){// 有符号整数(默认)intsigned_num=-10;unsignedintunsigned_num=10;// 赋值超出范围(会发生溢出)signedcharchar1=127;// 有符号char范围: -128 ~ 127unsignedcharchar2=255;// 无符号char范围: 0 ~ 255// 溢出测试char1=char1+1;// 127 + 1 → -128(有符号溢出)char2=char2+1;// 255 + 1 → 0(无符号溢出)// 打印结果printf("有符号整数: %d\n",signed_num);printf("无符号整数: %u\n",unsigned_num);printf("有符号字符溢出: %d\n",char1);printf("无符号字符溢出: %u\n",char2);// 比较操作(隐式转换)if(-5>(unsignedint)5){printf("-5 大于 5(无符号比较)\n");}else{printf("-5 小于 5(无符号比较)\n");}return0;}最后运行结果:
隐式类型转换规则
当有符号数与无符号数比较时,C语言会将有符号数隐式转换为无符号数,转换规则为:
若有符号数的值为负数,则通过补码规则转换为无符号数(即视为一个非常大的正数);
若为正数,则直接转换为对应无符号数(值不变)。
通过类型转换规则可知,-5在比较时被视为4294967291,因此大于无符号数5。
所以要避免混合类型比较,同时也要理解补码机制。
(可以上网了解一下相关知识)
三.数据类型的取值范围
1.整型(integer)
| 类型 | 关键字 | 存储空间 | 有符号取值范围 | 无符号取值范围 |
|---|---|---|---|---|
| 短整型 | short | 2字节 | − 32768 32767 -32768 ~ 32767−3276832767(− 2 15 2 15 − 1 -2^{15} ~ 2^{15}-1−215215−1) | 0 65535 0 ~ 65535065535(2 16 − 1 2^{16}-1216−1) |
| 整型 | int | 4字节 | − 2147483648 2147483647 -2147483648 ~ 2147483647−21474836482147483647(− 2 31 2 31 − 1 -2^{31} ~ 2^{31}-1−231231−1) | 0 4294967295 0 ~ 429496729504294967295(2 32 − 1 2^{32}-1232−1) |
| 长整型 | long | 4/8字节 | − 2147483648 2147483647 -2147483648 ~ 2147483647−21474836482147483647(多数系统) | 0 4294967295 0 ~ 429496729504294967295(多数系统) |
| 长整型(C99) | long long | 8字节 | − 9223372036854775808 9223372036854775807 -9223372036854775808 ~ 9223372036854775807−92233720368547758089223372036854775807(− 2 63 2 63 − 1 -2^{63} ~ 2^{63}-1−263263−1) | 0 18446744073709551615 0 ~ 18446744073709551615018446744073709551615(2 64 − 1 2^{64}-1264−1) |
| 字符型 | char | 1字节 | − 128 127 -128 ~ 127−128127(有符号) | 0 255 0 ~ 2550255(无符号) |
2.浮点型(Floating-Point)
| 类型 | 关键字 | 存储空间 | 数值范围 | 有效数字位数 |
|---|---|---|---|---|
| 单精度型 | float | 4字节 | ±1.2×10⁻³⁸ ~ ±3.4×10³⁸ | 6~7位 |
| 双精度型 | double | 8字节 | ±2.3×10⁻³⁰⁸ ~ ±1.8×10³⁰⁸ | 15~16位 |
| 长双精度型 | long double | 8/16字节 | 更高范围(依赖系统,如 ±1.2×10⁻⁴⁹³² ~ ±1.1×10⁴⁹³²) | 18~19位(部分系统) |
3.取值范围的计算方法
(1). 无符号类型:
范围为 0 到 2^n - 1(n 为位数)。
例如:unsigned char(8 位)的范围是 0 到 255(即 2^8 - 1)。
(2). 有符号类型:
采用补码表示,范围为 -2^(n-1) 到 2^(n-1) - 1。
例如:int(32 位)的范围是 -2^31 到 2^31 - 1。
4.代码验证取值范围
可以使用 <limits.h> 和 <float.h> 头文件中的宏来获取具体平台的取值范围:
#include<stdio.h>#include<limits.h>// 整数类型限制#include<float.h>// 浮点类型限制intmain(){// 整数类型范围printf("char 范围: %d 到 %d\n",CHAR_MIN,CHAR_MAX);printf("unsigned char 范围: 0 到 %u\n",UCHAR_MAX);printf("int 范围: %d 到 %d\n",INT_MIN,INT_MAX);printf("unsigned int 范围: 0 到 %u\n",UINT_MAX);// 浮点类型范围printf("float 最小正值: %e\n",FLT_MIN);printf("float 最大正值: %e\n",FLT_MAX);printf("double 最小正值: %e\n",DBL_MIN);printf("double 最大正值: %e\n",DBL_MAX);return0;}其对应的值:
四.变量
1.变量的定义
变量定义需要指定变量的数据类型和变量名,还可以对变量进行初始化。例如:intnum = 10; 定义了一个名为num的整型变量,并初始化为10。
2.数据类型
(1).基本数据类型:包括整型(int)、短整型(short)、长整型(long)、字符型(char)、单精度浮点型(float)、双精度浮点型(double)等。不同的数据类型占用不同的存储空间,具有不同的取值范围和精度。
(2).派生数据类型:通过对基本数据类型进行组合或修饰得到,如数组、指针、结构体、联合体、枚举等。例如,数组是一组相同类型元素的集合,intarr[5]; 定义了一个包含 5 个整型元素的数组。
3.变量的命名规则
(1).变量名只能由字母、数字和下划线组成。
(2).不能以数字开头。
(3).不能使用 C 语言的关键字作为变量名。
(4).变量名应具有描述性,以便于理解其用途。
4.全局变量和局部变量
全局变量特点:
(1).作用域覆盖整个程序,也就是说,程序里的任何函数、类或者代码块都能够对其进行访问。
(2).生命周期和程序的运行周期是一样的,程序开始运行时它就被创建,程序结束运行时它才会被销毁。
(3).不过要注意,过度使用全局变量会让代码之间的耦合度提高,使程序的可维护性变差,所以在使用时要谨慎。
局部变量特点(在函数、类或者代码块的内部定义的):
(1).只能在定义它的那个函数、类或者代码块内部被访问,外部无法访问。
(2).当函数、类或者代码块执行完毕后,局部变量就会被销毁,它的生命周期比较短。
(3).局部变量可以和全局变量使用相同的名称,在这种情况下,局部变量会暂时覆盖全局变量。(所以要避免两者使用相同的名称 (●’◡’●) )
值得注意的是,局部变量优先全局变量!!!
(不要问为什么,问就是作者已经长记性了😂)
简单示意图
#include<stdio.h>intnum2=753;//全局变量intmain(){intnum1=144;//局部变量printf("%d\n",num1);printf("%d\n",num2);return0;}五.了解操作符
1.算术操作符
常见类型有:
加法(+):两数相加,如 3+5=8 。
减法(-):两数相减,如 7-2=5 。
乘法(×或*):两数相乘,如 4×3=12 (代码中用 * )。
除法(÷或/):两数相除,如 8÷2=4 (代码中用 / )。
取余(%):求除法余数,如 10%3=1 。
幂运算(^或**):求指数,如 2^3=8 (代码中用**)。
简单示例#include<stdio.h>intmain(){inta=2,b=3;intc1,c2,c3,c4,c5,c6;c1=a+b;c2=a-b;c3=a*b;c4=a/b;//结果取商c5=a%b;//结果取模(余)c6=a^b;printf("c1 = %d\nc2 = %d\nc3 = %d\nc4 = %d\nc5 = %d\nc6 = %d\n",c1,c2,c3,c4,c5,c6);return0;}最后运行结果
2.赋值操作符
赋值操作符用于将值赋给变量,是编程中最基础的操作之一。
常见赋值操作符:
基本赋值(=)
将右侧值赋给左侧变量,如 a=10 (将 10 赋给变量 a )。
复合赋值(简化运算赋值)
加法赋值(+=): a+=5 等价于 a=a+5 。
减法赋值(-=): b-=3 等价于 b=b-3 。
乘法赋值(*=): c*=2 等价于 c=c*2 。
除法赋值(/=): d/=4 等价于 d=d/4 。
取余赋值(%=): e%=3 等价于 e=e % 3 。
幂运算赋值(**=): f**=2 等价于 f=f**2 。
作用:
(1).简化代码,提升可读性,尤其在需要多次更新变量值的场景中(如循环累加)。
(2).不同编程语言中可能支持更多复合操作符(如位运算赋值),需结合具体语言规则使用。
简单示例#include<stdio.h>intmain(){inta=5,b=6,c=7,d=8,e=9,f=10;a+=11;b-=12;c*=13;d/=14;e%=15;f^=16;printf("a = %d\nb = %d\nc = %d\nd = %d\ne = %d\nf = %d\n",a,b,c,d,e,f);return0;最后运行结果
3.单目操作符
单目操作符是只操作 一个操作数 的运算符,常见类型及功能如下:
常见单目操作符
(1).逻辑非(!)
对布尔值取反:!true结果为false,!false结果为true。
简单示例#define_CRT_SECURE_NO_WARNINGS//由于scanf在vs会报错(vs用的是scanf_s),所以可以在代码最顶端加入这行代码#include<stdio.h>intmain(){intnum;// 提示用户输入一个整数printf("请输入一个整数: ");scanf("%d",&num);// 使用逻辑非运算符判断if(!num){printf("你输入的是0,取反后为真(非零)。\n");}else{printf("你输入的是非零值(%d),取反后为假(0)。\n",num);}return0;}最后运行结果分别为
(2).取反(-)
对数值取相反数: -5 结果为 5 , -(-3) 结果为 3 。
#include<stdio.h>intmain(){doublenum;// 输入一个数值printf("请输入一个数值: ");scanf("%lf",&num);// %lf用于读取double类型// 计算并输出相反数printf("该数值的相反数是: %.2lf\n",-num);//.2的意思是保留小数点后两位return0;}(3).按位取反
在 C 语言里,按位取反操作符是~,其作用是对一个二进制数的每一位进行取反操作,也就是将 0 变为 1,将 1 变为 0。
基础概念
操作符符号:~
功能:对操作数的二进制位逐一取反
操作数类型:整型(像int、char这类)
本质:把每一位的状态进行翻转
运算规则
对二进制数的每一位执行取反操作:
0 取反后变成 1
1 取反后变成 0
原码、反码、补码的转换
在计算机内部,负数采用补码形式存储,因此按位取反的计算要结合补码规则来理解:
1.原码:直接用二进制表示数值,最高位作为符号位(0 代表正数,1 代表负数)。
2.反码:正数的反码和原码相同;负数的反码是在原码的基础上,符号位保持不变,其余位取反。
3.补码:正数的补码与原码一样;负数的补码是其反码加 1。(正数则减1)
计算公式
对整数x进行按位取反操作,结果为-(x+1)。
举例如下:
若x = 5,那么~x = -6
若x = -3,则~x = 2
对正数按位取反示例#include<stdio.h>intmain(){inta=5;//二进制:0000 0000 0000 0101(假设为32位整数)intb=~a;//按位取反:1111 1111 1111 1010(补码形式)printf("~%d = %d\n",a,b);//输出:~5 = -6return0;}/*计算步骤: 1. 5的原码是0000 0101。 2. 按位取反后得到1111 1010(这是补码形式)。 3. 补码1111 1010转换为原码: 先减 1,得到反码1111 1001。 再取反(符号位不变),得到原码1000 0110,其值为-6。*/(4).自增(++)
变量值加 1,分 前置( ++a )和 后置( a++ ):
前置:先自增,再使用变量值。
后置:先使用变量值,再自增。
#include<stdio.h>intmain(){intx=5;inta=++x;// x变为6,a的值为6(前置)intb=x++;// x变为7,b的值为6(后置)printf("a = %d\nb = %d\n",a,b);return0;}(5).自减(–)
变量值减 1,分 前置( --a )和 后置( a-- ),逻辑与自增类似。
(6).求字节数(sizeof)
在 C 语言中,sizeof是用于计算数据类型或变量占用内存字节数的操作符。
一、基本概念
1.作用
返回数据类型、变量或表达式占用的内存字节数(以字节为单位)。
结果类型为size_t(无符号整数类型)。
语法sizeof(类型名);// 计算类型的大小sizeof(表达式);// 计算表达式结果类型的大小sizeof表达式;// 省略括号(变量或常量表达式)#include<stdio.h>intmain(){// 基本数据类型printf("char: %zu 字节\n",sizeof(char));printf("short: %zu 字节\n",sizeof(short));printf("int: %zu 字节\n",sizeof(int));printf("long: %zu 字节\n",sizeof(long));printf("long long: %zu 字节\n",sizeof(longlong));printf("float: %zu 字节\n",sizeof(float));printf("double: %zu 字节\n",sizeof(double));printf("long double: %zu 字节\n",sizeof(longdouble));return0;}
对于数组、指针等字节长度后续相关文章会发
(7).类型转换(强制类型转换)
将操作数转换为指定类型,如 (int)3.9 (C语言中转为整数 3 )。
(8).指针操作&和*(这里简单了解一下)
解引用(*):获取指针指向的值。
取地址(&):获取变量的内存地址。
#include<stdio.h>intmain(){intx=10;int*ptr=&x;printf("%d",*ptr);// 输出10return0;}特点
操作数唯一:仅作用于一个变量或值。
优先级较高:通常高于双目操作符(如加减乘除)。
语言差异:不同编程语言支持的单目操作符可能不同(如 Python 无 ++/-- ,但有 +/- 符号操作)。
理解单目操作符的逻辑和使用场景,能有效简化代码逻辑(如计数、状态切换等)。
六.强制类型转换
强制类型转换是将变量或表达式从一种数据类型显式转换为另一种数据类型的操作,常用于需要统一数据类型的场景。
常见方式(C语言)
1.显式类型转换(语法格式因语言而异)
2.转换规则与注意事项
(1).数值类型转换:
大范围转小范围(如int转byte)可能丢失精度或溢出。
浮点转整数通常会截断小数部分(如 5.9 → 5 )。
(2).布尔值转换:
非零数值、非空字符串等通常转为true,0、null、undefined等转为false。
(3).字符串与数值互转:
字符串需符合数值格式(如 “123” 可转, “abc” 会报错)。
七.scanf和printf的介绍
最后我们再简单了解一下scanf(输入函数)和printf(输出函数)scanf和printf是 C 语言中常用的输入输出函数,用于实现程序与用户的交互。以下是简单介绍:
关于printf
printf:格式化输出函数
功能:将数据按指定格式输出到控制台(或标准输出设备)。
语法printf("格式控制字符串",输出项1,输出项2,·····);1.格式控制字符串:
普通字符:直接输出的文本(如 “Hello, World!” )。
格式说明符:指定输出数据的类型和格式,以%开头,常见示例:
%d:输出整数(如%d对应int类型)。%f:输出浮点数(默认保留 6 位小数,如 3.14 输出为 3.140000 )。%s:输出字符串(如%s对应char*类型)。%c:输出单个字符(如%c对应char类型)。
格式修饰符:调整输出宽度、对齐方式等,例如:
%5d:输出整数占 5 列宽度,右对齐。%.2f:输出浮点数保留 2 位小数(如 3.1415 → 3.14 )。
2.输出项:
需与格式说明符一一对应,类型匹配。
例如:
关于scanf
scanf:格式化输入函数
功能:从控制台(或标准输入设备)读取用户输入的数据,并按指定格式存储到变量中。
语法printf("格式控制字符串",变量地址1,变量地址2,·····);1.格式控制字符串:
主要包含格式说明符(与printf类似),用于指定输入数据的类型,如%d、%f、%s等。
普通字符(如逗号、空格)需与用户输入严格匹配
例如
scanf(“%d,%d”,&a,&b) ,用户需输入 10, 20
2.变量地址:
必须使用&运算符获取变量的内存地址(指针),而非直接传递变量名。
注意事项
1.输入缓冲区问题:
输入字符串时(%s),遇空格或换行符会终止,且不包含分隔符。
读取字符(%c)时,会读取缓冲区中的空格、换行符等空白字符,需注意清空缓冲区。
2.类型匹配:
若输入数据类型与格式说明符不匹配(如给%d输入字符),可能导致程序崩溃或读取错误值。
3.安全隐患:
C99 后建议使用%n等危险格式符时谨慎,避免缓冲区溢出(现代编程中更推荐使用 fgets 等安全函数处理字符串输入)。
总之,scanf和printf是 C 语言基础交互工具,熟练掌握格式控制能灵活处理各种输入输出需求。
八.ASCLL码表参考
👀 关注我们一路同行,从入门到大师,慢慢沉淀、稳步成长
❤️ 点赞鼓励原创,让优质内容被更多人看见
⭐ 收藏收好核心知识点与实战技巧,需要时随时查阅
💬 评论分享你的疑问或踩坑经历,一起交流避坑、共同进步