2024.7.23第七天笔记
C语言的数据类型
-
基本类型
-
数值类型
-
整型
-
短整型: short
-
整型: int
-
长整型: long
-
长长整形:long long
-
-
浮点型
-
单精度:float
-
双精度:double
-
-
-
字符类型:char
-
-
自定义/构造类型【后续学习】
-
结构体:struct
-
共用体:union
-
枚举:enum
-
-
指针类型【后续学习】:*
-
空类型:void
常量与变量
在C语言中的表现形式是常量与变量
常量
常量:在程序执行过程当中其值不能改变的量称之为常量
1.数值常量
整数常量
-
二进制常量:以0b开头,由0,1两个数字构成
举例:0b1111、0b0110、0b01110101
-
八进制常量:以0开通,由0~7八个数字构成
举例:012345、07654 -075
-
十进制常量:默认,由0~9共十个数字构成
举例:1234、9876、-87654
-
十六进制常量:以0x开头,由09,AF共16个字符构成,一般用于嵌入式开发
举例:0xFFFFFF、0xFFFF00
小数常量
-
单精度:常常给单精度的数值后加F作为标记
举例:12.24F、-45.4444F
-
双精度:默认就是双精度
举例:12.24、-45.4444
2.字符常量
用单引号' '
引起了的单个字符
举例:'a' '1'
注意:'a'
-字符,'马'
-错误
转义符:
'\n'
:换行
'\t'
:制表符
'\\'
:反斜线,\
'\0'
:0字符对应的ASCII码值是0
3.符号常量
使用#define
定义的宏
举例:定义#define PI 3.1415926
定义π,使用-2 * PI
案例:
#include <stdio.h>
//通过宏定义一个端口号,宏定义使用大写加下划线命名法
#define PORT 3000
int main()
{
printf("http://localhost:%d\n",PORT);
return 0;
}
4.字符串常量
使用"..."
引起来的字符序列,称之为字符串常量
注意:C语言常量是支持字符串的,C语言变量不支持字符串(需要字符数组或者字符指针进行模拟)
举例:printf("Hello World")、printf("")、printf(1)-数值常量、printf("1")-字符串常量
案例:
#include<stdio.h>
int main()
{
//字符串:指针表示
char *str1 = "欢迎六位同学!";
//字符串:数组表示
char str2[] = "欢迎六位同学!";
char *str11 = "欢迎六位同学!\0";
printf("%ld,%ld,%ld\n",sizeof(str1),sizeof(str2),sizeof(str11));
return 0;
}
5.空常量
用于给指针变量作为默认值初始化:int *p=NULL;
注意:*
前面是常量或者变量,此时*
是数学运算符乘号,*
前面是数据类型,此时*
表示指针
补充
长整型一般在数值后面加L或者l;长长整形一般在数值后面加LL或者ll
long a = 90L; long long b = 99LL;
练习题
#include<stdio.h>
/**
*入口函数
*/
int main()
{
int num = 12;
num = 13;
printf(num); // 13 输出变量
printf("num");// num 字符串常量,这个常量是隐式创建
printf(12); // 12 数值常量,这个常量是隐式创建
printf("%d",90L); // 90 数值常量
}
变量
说明
-
在程序执行过程中可以改变的量称之为变量。
-
变量是内存中一块用来存储数据的空间。
-
变量由变量名+变量值构成。通过变量名可以存放和获取变量值。
变量定义格式
变量数据类型 变量名列表;
举例:
// ① 声明变量并赋值 (声明一块变量存储单元,并向这个空间存储一个初始值)
int num = 5; //将5赋值给变量num,也就是将5赋值给变量num对应的存储单元
int a = 3,b = 4,c = 5;
// ② 声明一个变量,再给变量赋值(声明一块变量,暂时为空)
int age;
age = 21;
// 混合应用
int count = 0 ; //此时,count变量空间中存储的数据是0
count = 1;// 此时,count 变量空间中存储的数据是1
变量名的命名要符合下列两个规则
-
变量名必须以字母或下划线开头,后面可以跟若干个字母、数字或下划线,如:max_width
-
变量名不能与C语言中已经存在的标识符重名,也就是关键字和保留字不能作为变量名
变量名、变量值、变量所占存储单元之间的关系
注意:在C语言中,要求对所用到的变量使用前必须先强制定义,即:先定义,后使用。
C语言中的3类标识符
关键字: 有32个,系统有特定的含义和用途,如:float、int、if、else等,不能用作变量名;
auto break case char const continue default do double else enum extern float fore goto if int long register return short signed sizeof static struct switch typedef union unsigned void valatile while
系统预定义的标识符:如系统提供的库函数名sin、printf、main及预编译命令define、include等;
define endif elif error line include ifdef ifndef pragma undef if else
用户标识符:用户定义的标识符,用来给程序中的变量、自定义函数、符号常量、数组、结构体、共用体、文件等命名。
扩展
常见字符编码
-
ASCII:1个字符等于1个字节,总共256个字符
-
GBK:1个字符等于2个字节,表示简体、繁体及其符号。“。表示:
\xced2
-
Unicode:四个字节表示:全球统一编码,囊括了全世界所有字符。表示:
\u6211
-
UTF-8:长度变化的字符集,是对Unicode字符集的优化,提高效率,表示:
\xe68891
-
ISO-8859-1:这个是西欧语言字符集
如果代码中有字符乱码...编码和解码的字符集一致
解决方案:
1.修改成一致的编码
2.或成英文或数字,毕竟只有中文才会乱码
进制转换
我们目前接触到的进制有二进制、八进制、十进制、十六进制
-
其他进制转十进制:
按权相加
1.(1234)10=4 * 100+3 * 101+2 * 102+1 * 103
2.(0x1234)16=4 * 160+3 * 161+2 * 162+1 * 163
-
十进制转其他进制:
辗转相除法:将需要转换的数据不停的除以转换的进制数。直到商为0
1.十进制转二进制:
2.十进制转八进制:
-
八进制转十六进制
借助于二进制,将八进制转换为二进制,将二进制转换为十六进制
-
十六进制转八进制
借助于二进制,将十六进制转换为二进制,将二进制转换为八进制
有符号数和无符号数
在C语言中,整数是可以带符号的(有符号,signed)或不带符号的(无符号的,unsigned)。这两种类型的整数在内存中以二进制形式表示。并使用不同的模式。
-
有符号数(Signed Numbers)
有符号数是来表示正数、负数、0的整数类型。在内存中,有符号数使用最高位(通常是符号位)来表示正负。如果最高位为0,表示这个数是正数或0,如果最高位为1,表示这个数是负数。其余位用于表示数值本身。
举例:例如一个8位有符号整数可以表示的范围是
-128~127
。这是因为1位用于表示符号(正或负),剩余的7位注意:有符号位是默认的,在C语言中,基本整数类型如int,short,long默认为有符号,除非明确指定为无符号
举例:
signed int num = 12; // 标准有符号位写法 int num == 12; // 默认省略signed关键字
-
无符号数(Unsigned Numbers)
无符号数是只能表示非负整数的数据类型。在内存中,无符号数不使用符号位,所有位都用于表示数值。因为,无符号数的范围比有符号数的范围更大。
注意:在C语言中,通过关键字后添加
unsigned
。来指定无符号类型,如unsigned int、unsigned short...举例:例如一个8位无符号整数可以表示的范围是
0~255
。这是因为所哟有8位全都用来表示数值,没有符号位。unsigned int num = 12; // 标准无符号位写法
原码、反码和补码
概念
原码
-
原码是一种最简单的表示有符号数的方法。
-
使用最高位(最左边的一位)表示符号:0表示正数,1表示负数。
-
其余位表示数值的大小。
举例:
[+1]原 = 0000 0001 [ -1]原 = 1000 0001
反码
-
反码是通过对原码的数值部分逐位取反(0变1,1变0)得到的。
-
正数的反码和原码相同。
-
负数的反码是其原码除符号位外所有位取反。
举例:
[+1] = [00000001]原 = [00000001]反 [ -1] = [10000001]原 = [11111110]反
补码
-
补码是反码加1得到的。
-
正数的补码和原码相同。
-
负数的补码是其反码加1。
举例:
[+1] = [00000001]原 = [00000001]反 = [00000001]补 [ -1] = [10000001]原 = [11111110]反 = [11111111]补
可见如果一个反码表示的是负数, 人脑无法直观的看出来它的数值. 通常要将其转换成原码再计算。
原因
原码、反码和补码主要是为了解决计算机中负数的表示和运算问题。在计算机中,数据以二进制的形式表示,而负数在二进制下不易处理,因此需要采用一些特殊的方法来表示负数,避免出现计算错误。
原码是最简单的表示方法,直接将负数的最高位设置为1,其余位表示数值大小即可。但是原码存在两个问题,一是加减法雲要分别处理正负数,二是原码的0存在两个表示方式, 反码是解决原码加减问题的方法之一,它的负数表示方法是将原码中除符号位外的所有位取反。但是反码也存在一个问题,即对于0有两个表示。
补码是解决原码加减和0两个表示问题的方法之一,它的负数表示方法是将原码的符号位不变,其余所有位取反后加1。这样做的好处是使加减法的处理变得简单,同时只有一种表示0的方式。 因此,原码、反码和补码都是为了解决计算机中负数的表示和运算问题而设计的,不同的方法有不同的特点和应用场景。
原码、反码、补码之间的转换关系
-
原码与补码之间的转换
对于一个原码,可以将它转换成补码,然后再进行运算。转换的方法如下:
1. 如果原码为正数,则它的补码与原码相同。
2.如果原码为负数,则将原码的绝对值转换成二进制数,然后将这个二进制数除符号位外的所有位取反,最后加1,得到的结果即为它的补码。
-
补码与原码之间的转换
补码和原码之间的转换也是十分重要的。当我们需要将补码转换成原码时,可以按照以下步骤进行:
1.如果补码的最高位是1,说明这个补码所代表的数是负数。将补码除符号位外的所有位取反(0变成1,1变成0),得到反码。
2.在反码的基础上,将所有位加1,得到原码。
补充
-
正数的原码补码和反码都相同
-
补码再取补码等于源码
-
±0的补码、移码相同
以上是我嵌入式学习第七天的笔记,有什么问题还请指正,谢谢!