前情回顾:在1级的时候,我们学习到的技能有:引入头文件、定义主函数、使用输出函数。
概念
变量是什么?
变量是计算机编程中一个非常重要的概念,它用于存储和操作数据。在C语言中,变量是一个有名称的存储位置,用于保存程序运行过程中可能会改变的数据值。
变量有什么用?
在1级文章中 ,我们编写了第一个程序,将"Hello World"打印到控制台中。假设在后续,我们需要打印"Good Bye"呢,而我们就需要去修改printf()函数中的内容。还有一种更好的方法,就是使用变量将要输出的内容存储起来,在后面可以直接修改这个变量,最后将这个变量作为内容调用printf()函数即可实现显示变量的内容。
数据类型
C语言中基本数据类型有:整型(像10)、浮点数(像9.9)和字符(‘A’)。复合数据类型有:结构体、枚举、共用体。
C语言是强类型的,也就是规定了该变量只能存储什么样的值,例如:int类型只能存整数(正负数),带unsigned的数据类型只能存正数如unsigned int,float/double类型只能存浮点数。
带short的类型存数的范围更小,带long的类型存数的范围更大。以下是c语言中基本数据类型所占的字节数:
1B = 8b(1byte=8bit):1字节=8位二进制
我们也可以进行编程进行查看,我们可以使用sizeof()函数进行查看括号中内容在内存中所占的字节数。需要记住的有char型占1B,int型占4B、float型占4B、double占8B
程序代码:
#include <stdio.h>
int main()
{
printf("char类型占%dB\n",sizeof(char));
printf("int类型占%dB\n",sizeof(int));
printf("float类型占%dB\n",sizeof(float));
printf("double类型占%dB\n",sizeof(double));
return 0;
}
printf("char类型占%dB\n", sizeof(char));
printf()输出函数,%d为占位符,可以理解为给后面的数值占个位置,当输出时会被替换成后面的数值。\n是换行符,可以理解成在word文档中敲了个回车键换行。sizeof(char)返回char类型所占的字节数。
运行结果:
变量
变量的定义
变量的定义及初始化格式:数据类型 变量名 = 赋值;
int a = 5;
我们定义了一个int类型的变量,变量名是a,并初始化为5。在编程语言中,=并不是相等的意思,而是赋值的意思。将等式右边赋给等式左边。以上方式就是变量的定义和初始化。
变量的定义格式:数据类型 变量名;
int a;
a = 5;
我们可以先定义变量,在之后进行赋值。值得注意的是,如果不进行变量的初始化,该变量的值为一个垃圾值,因为该变量内存空间很有可能被其他程序使用过,留存下了一个毫无意义的数值,即垃圾值。所以我们最好进行初始化,也就是自己手动给它一个有意义的值。
多个同类型变量的定义格式:数据类型 变量名1,变量2;
int a,b;
a=3;
b=5;
如果想要定义相同数据类型的多个变量可以将多个变量名用逗号隔开(英文),并且也可以对任意一个变量定义时就初始化。如 int a=3,b=5; 或者某一个变量定义时就初始化 如 int a,b=5;
变量命名规范
变量名只能由字母(a~z,A~Z)、数字 (0~9)、下划线(_)组成,并且数字不能作为开头!还有不能使用关键字作为变量名(例:int、float、enum....)
以下标识符是合法的:i、a、count、 number_of_book、BOOK_NUMBER、sum100、_total。
以下标识符是非法的:
3com:以数字开头。
char:char是C语言的一个数据类型,是 关键字,不能作为变量名,其他的如int、float等类似。
a*b:*不能作为标识符的字符。
number of book:标识符中不能有空格。
注意:C语言是区分大小写的,如Count与count被认为是两个不同的标识符。
变量的使用
程序代码:
#include <stdio.h>
int main()
{
int x = 10; //变量初始化
printf("x=%d\n",x);
x = 20; //变量的赋值
printf("x=%d\n",x);
return 0;
}
分析程序:
首先我们定义一个int类型的变量,变量名为x。操作系统会为变量x在内存中分配一块4字节的空间供其使用,再将10变为补码形式存储在变量空间内。接下来,我们使用了printf()函数打印了变量x内存中所存的整数。在程序的过程中,我们可以随时改变x中的值,将x再次赋值为20,再次打印x的值,可以看到x的值被改变了。
运行结果:
科学记数法
在表示较为大的数字时,我们常用科学计数法表示,例如1000记作。在c语言中,也可以使用科学记数法表示数,格式为e后加指数,指数可正可负。
程序代码:
#include <stdio.h>
int main()
{
int x = 1e3; //1×10的3次方
int y = 1000e-2; //1000×10的-2次方
printf("x=%d\n",x);
printf("y=%d\n",y);
return 0;
}
运行结果:
拓展
进制转换
以下是进制转换表,在本文中不详细讲解如何进制转换,可以查看其他相关资料进行学习,最常用的是:二进制、十进制、十六进制。在计算机中,不管是存储还是运算,都是使用二进制,也就是0101代码。
如,十进制的12转二进制,一眼可见12=8+4。根据权重法,所以12转二进制为1100。再例如13转二进制,13=8+4+1,所以13转二进制为1101。
编码格式
在计算机中,存储有符号整型采用补码方式,存储浮点数采用IEEE754标准格式,存储字符采用ASCII码形式。 接下来,我们来学习编码格式。如果想要深入了解,可以学习一下《计算机组成原理》。
原码
原码是计算机中表示整数的一种编码方式,主要用于表示有符号数(即正数和负数)。它直接用一个二进制数来表示一个整数。最高位是符号位,0表示正数,1表示负数,其余位表示数值部分。
例如:+10转原码为:0,1010;-5转原码为:1,0101
技巧:先将数转成二进制,再根据符号在最高位添0或1即可
反码
反码是原码的反向表示,即除了符号位外,其余位取反。对于正数,反码与原码相同;对于负数,反码是原码的数值部分取反。
例如:+10原码是0,1010;反码是0,1010。-5原码是1,0101;反码是1,1010。
口诀:正数反码与原码不变;负数将原码除符号位,其他位所有取反
补码
补码是计算机中表示有符号整数的编码方式,也是目前计算机系统中最常用的方式。它解决了原码和反码在表示和运算上的问题,使得加法和减法运算更加高效和统一。对于正数,补码与原码相同;对于负数,补码是原码取反后加1,或者反码加1。
例如:
+10原码是0,1010;反码是0,1010;补码是0,1010。
-5原码是1,0101;反码是1,1010;补码是1,1011。
口诀:正数不变,负数将原码除符号位取反,末位再+1(也就是反码+1)
移码
移码是一种用于表示有符号数的编码方式,通过在数值上加上一个固定的偏移量 K 来转换数值范围,使得所有数值都表示为非负数。对于正负数,只需将补码的符号位取反即可。
移码主要用于浮点数的指数部分表示,例如在 IEEE 754 浮点数标准中,指数部分使用移码来简化浮点数的比较和计算。
例如:
+10原码是0,1010;反码是0,1010;补码是0,1010,移码是1,1010。
-5原码是1,0101;反码是1,1010;补码是1,1011,移码是0,1011。
口诀:不管正负数,将其补码的符号位取反即可
在上面变量的例子中,我们定义了一个变量int x=10,其实在内存中存储的是10的补码0,1010,因为int类型占4字节即32位,需要扩充为32位,也就是0,000 0000 0000 0000 0000 0000 0000 1010。这里再一提,因为10是正数所以不够的位填充0,假设是负数的话就填充1。
IEEE754标准
IEEE 754标准是由电气和电子工程师协会(IEEE)制定的一种二进制浮点数算术标准,用于规定计算机中浮点数的存储格式、运算规则和舍入方式等内容。浮点数的表示:符号位(1位)+指数部分(单精度8位/双精度11位)+尾数部分(单精度23位/双精度52位)。由此可见,单精度浮点数需要32位,双精度浮点数需要64位。指数部分采用移码形式,尾数部分采用原码形式
例如:将6.125转成IEEE754的单精度标准
第一步:6.125 是正数,因此符号位为 0
第二步:十进制转二进制。整数部分6转二进制为110;小数部分0.125转二进制为001.因此6.125转二进制为110.001
第三步:进行规格化。将二进制数规格化为科学计数法形式:。可以看出指数是e=2,再加上偏移量127,即E=e+127=129。E就是指数部分,转二进制为1000 0001
第四步:规格化后的尾数为1.10001,去掉隐含的1后为10001,将其填充到23位,尾数部分即10001000000000000000000
第五步:组合,将符号位、指数部分和尾数部分组合到一起。6.125转IEEE754标准为 0100 0000 1100 0100 0000 0000 0000 0000,转换为十六进制表示:0x40c20000H
float x = 6.125;
假设我们定义了一个float类型的变量x,将6.125赋值给x,而float作为单精度占32位,其内存空间存储的为6.125的IEEE754标准,即0100 0000 1100 0100 0000 0000 0000 0000
ASCII码
ASCII码是一种基于英文字符的字符编码标准,用于将字符(包括字母、数字、标点符号以及一些控制字符)表示为计算机可以识别的二进制数。以下是ASCII码表,只需了解一下即可:
由表可知,字母“A”在ASCII码中对应的十进制是65,则对应的二进制代码是0100 0001。
char c = 'A';
计算机参考ASCII码,将字符A转换成对应的二进制进行存储,由于char占1B即8位,则在内存中存储A的二进制代码为0100 0001
示例程序:
#include <stdio.h>
int main()
{
char c = 'A';
printf("字符A对应ASCII码的十进制值=%d\n",c);
return 0;
}
运行结果: