1.1 c 语言 中 数据类型
类型 | 字节数 | 取值范围 |
---|---|---|
int | 2 | - 32768 ~ 32767 (5位十进制数) |
int | 4 | - 2147483648 ~ 2147483647 (10位十进制数) |
unsignde int | 2 | 0 ~ 65535 (5位十进制数) |
unsignde int | 4 | 0 ~ 4294967295 (10位十进制数) |
short | 2 | - 32768 ~ 32767 (5位十进制数) |
unsigned short | 2 | 0 ~ 65535 (5位十进制数) |
long | 4 | - 2147483648 ~ 2147483647 (10位十进制数) |
usigned long | 4 | 0 ~ 4294967295 (10位十进制数) |
long long | 8 | - 9223372036854775808 ~ 9223372036854775807(20位十进制数) |
unsigned long long | 8 | 0 ~ 18446744073709551615 (20位十进制数) |
-
整形 :内存中存放的是补码
-
两个整数相除,结果直接舍弃小数部分
-
-
数字默认为 int 型,数后加 l ---> ☞为long型
-
枚举 :Mon、Tues、Wed 这些名字都被替换成了对应的数字。这意味着,Mon、Tues、Wed 等都不是变量,它们不占用数据区(常量区、全局数据区、栈区和堆区)的内存,而是直接被编译到命令里面,放到代码区,所以不能用
&
取得它们的地址。这就是枚举的本质。 -
一些浮点数资料:
-
-
void 类型
1 函数返回为空 ,C 中有各种函数都不返回值,或者您可以说它们返回空。不返回值的函数的返回类型为空。例如 void exit (int status); 2 函数参数为空, C 中有各种函数不接受任何参数。不带参数的函数可以接受一个 void。例如 int rand(void); 3 指针指向 void 类型为 void * 的指针代表对象的地址,而不是类型。例如,内存分配函数 void *malloc( size_t size ); 返回指向 void 的指针,可以转换为任何数据类型。 -
struct 结构体名{
char a[10] ;
int age;
};
struct 结构体名 变量名;
变量名.a 变量名.age
-
结构体大小规则
-
结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
-
结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);
-
结构体大小结果要为成员中最大字节的整数倍。--》min(结构体成员最大字节,各个数据类型默认字节对齐数)
-
每个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。gcc中默认#pragma pack(4),可以通过预编译命令#pragma pack(n),n = 1,2,4,8,16来改变这一系数。
-
-
union 两个变量共用一个空间,一般通过一个变量接收数据,搭配另一个变量以位域的方式区分数据内容。
-
C/C++语言中数据类型 大小(字节)
double 8
float 4
long 4
int 2 (32位或64位系统下int的长度为4字节)
char 1
-
1 Byte(B字节) = 8 bit(位)--> 0001 0001
二进制序列用以表示计算机、电子信息数据容量的量纲,基本单位为字节B,字节向上分别为KB、MB、GB、TB,每级为前一级的1024倍,比如1KB=1024B,1M=1024KB。
-
对于32位计算机与64位计算机,字的大小往往不同。
32位计算机:1字=32位=4字节,64位计算机:1字=64位=8字节
1.2 变量
1.2.1 变量知识点
-
c文件不互通,有封装性
-
32位机 为基础的变量所占的字节
-
变量的完整定义
【存储类型】 【符号类型】 【变量的类型】 【变量的名字】
int a
-
【符号类型】
-
有符号(默认):signed 1位存 符号位 + 31 位 存的数据 有符号- +
-
无符号 :unsigned 32位存的数据 无符号,最小为 0
-
-
【存储类型】
-
未声明变量存储类型时,隐式声明为 auto型存储类型
-
auto :栈里面函数中的局部变量
-
生命周期 :变量的声明处开始,到函数结束为止
-
1.2.2 变量的存储类型与作用域
-
auto 自动类型 ,栈
-
static 静态 ,数据段(bss段,未初始化数据段)
-
extern 扩大作用域 ,引用全局变量
-
register 寄存器,glibc库源代码,变量放于CPU内
-
重要的数据存储:
-
main函数中
-
堆区
-
static
-
全局变量
-
-
局部变量
-
作用域:变量的声明处开始,到函数结束为止
-
生命周期:函数调用处开始,到函数调用结束为止
-
是栈里面函数中的局部变量(auto类型)
-
-
静态局部变量
-
作用域:变量声明处开始,到函数结束为止
-
生命周期:从程序开始到程序结束
-
存储在静态存储区域,必须初始化
-
-
全局变量
-
作用域:从声明处开始,到本.c结束为止
-
生命周期:从程序开始到程序结束
-
通常在本.c最上面的位置
-
命名:g_count -> global
-
-
extern 关键字
-
只能给全局变量声明
-
extern+类型+全局变量名字(此时不能直接赋值,只是声明,并非定义分配空间)
-
函数内extern,只在这个函数内可见
-
函数外extern,从此开始到本.c结束为止都可见
-
可在本.c的不同位置使用,也可以在他.c里面使用
-
-
不能轻易使用,破坏了变量的作用域,从而产生意想不到的错误,增加程序理解的难度
-
-
static 关键字
-
作用域:从声明处开始,到本.c结束为止
-
生命周期:从程序开始到程序结束
-
命名:s_count
-
-
静态全局
-
通常在本.c的最上面
-
对于整个工程来说,名字不能重复
-
相比全局的好处:只在本.c可见,那么在工程里面就可以多次使用
-
不能对静态全局使用 extern 关键字声明
-
-
全局与静态全局的差别
-
如果 全局变量声明前加上 static 关键字的话,那么就限定了此变量只能在本.c内使用
-
一般情况下,C语言需要用到全局变量的话,就用static关键字去限定他,这样可以保护他不被 他.c 改变
-
static int a;//静态局部int main(){add();//第一遍add 2add();//第二遍add 3 return 1; }int add(){static int a = 1;//若不为static ,函数调用一次,栈区释放一次,a的值不会随着调用累积。a += 1;pritnf("a = %d\n", a);}//register;寄存器类型变量,上述add中的 a,b参数(本身就有存储位置)
9.静态函数在a.h文件下如何让其在main.c文件下使用
1.3 格式控制符
char a ; ---- %c 1字节char n[5]; ---- %s 5字节short ---- %d 2字节int ---- %d 4字节long ----%ld 8字节unsigned float ---- %f 4字节double ---- %lf 8字节科学计数法 ---- %eenum ---- %d
1.4 说明符和转义字符
-
记忆 : " d o u x/X" --> “都行”
-
C 语言中 printf 输出 double 和 float 都可以用 %f 占位符 可以混用,而 double 可以额外用 %lf。
而 scanf 输入情况下 double 必须用 %lf,float 必须用 %f 不能混用
1.5 原码、反码、补码、解码
可看成时钟 满12归1 12 - 5 = 7 12 + 7 = 19
计算机 减法可用加法替代,加数即为补码
如:
-5
原码:1000 0101
反码:1111 1010
+1
补码:1111 1011
原 + 反 = 0111 1111
原 + 补 = 1000 0000
摘录:
补码原理与负数表示-CSDN博客
补码只是一种编码格式,它不是表示真正大小的数字。
假设计算机只能存两位,最大为99,则原码+补码=100:
9-49
=9+51
=60
60是-40的补码,100-40 = 60;
计算机只识别补码60,之后就会解码将其转化为实际数字-40。
人类是如何给计算机赋予负号的含义。就是通过补码的编码与解码。
1.6 常量
-
常量是固定值,在程序执行期间不会改变。这些固定的值,又叫做字面量。
常量可以是任何的基本数据类型,比如整数常量、浮点常量、字符常量,或字符串字面值,也有枚举常量。
常量就像是常规的变量,只不过常量的值在定义后不能进行修改。
-
符号常量
用标识符代表常量,定义格式 :
#define 标识符 常量
//不分配空间 将在代码中的标识符位置直接换为常量值 //宏定义最后不是以分号结尾的 //宏定义是无类型
const 类型 符号常量 = 常量 ; //结尾为分号 //类型声明 //符号常量 和 常量之间是以等号链接
*define宏定义在预编译时不会进行语法检测,相对来说,多用 const
-
-
-
字符常量:指单个ASCII码字符,有256个,如’a’和’b’。
-
数值常量:包括整型常量和实型常量。整型常量就是指常整数,有十进制、八进制、十六进制三种表示形式。实型常量只采用十进制小数形式和指数形式表示,包括单精度浮点数(float)、双精度浮点数(double)和长双精度浮点数(long double)。
-
常变量:具有变量的特征是存在一个以变量名命名的存储单元,在一般情况下,存储单元中的内容是可以变化的。而对于常变量,在变量的基础上加了一个限定:存储单元中的内容不允许变化,仍然是有存储单元的。
-
直接常量:整型 实型 字符 字符串
-
符号常量:是使用一个字符串代替程序中出现的一个标识符,是编译时把所有的符号常量都替换成制定的字符串,它没有类型,在内存中也不存在以符号常量命名的存储单元。在其作用域内其值不能改变和赋值。
1.7 常量的合法规则
判别合法的C语言常量。历年来多次重复考。
1.7.1 合法的整型常量。
十进制、八进制(以0开头,如0123合法的八进制,0128不合法的八进制)、十六进制(以0x开头,如0x125,0xef) 注意:是数字0不是字母o 或O ,16进制大小写一样。在整形常量末尾加L表示是长整型(long, 也是整型但比int型数值范围大),是合法的。如115L,就是长整型常量。
1.7.2 浮点型常量。
可以为十进制小数形式,但必须有小数点。如:0.1 0.0 12.0 12. .12 等。还可以为指数形式,但注意字母e或E前必须有数字,e后必须为整数。如:e3,2.e.5,e3都不合法。合法如:.5e3 5.5e3 5e3
C编译系统默认将浮点型常量作为double 型处理。因此,如0.123实际上系统当成double型数据,而0.123f,0.123F才按照float处理。这在实际运行中,不加f只是先按double型处理,然后转换成float型,降低了运行的速度,其他并无大碍。
1.7.3 字符型常量。
注意:字符型常量是用单引号括起来的单字符。合法的:’3’ ’a’ ‘b’ ‘\n’ ‘\’ ‘\b’ ‘\t’ ‘\r’ ‘\f’ ‘\’’ ‘\”’ ‘\ddd’ ‘\xhh’ 其中的ddd是1~3个 八进制数所代表的字符,hh是1到2个十六进制数所代表的字符。
1.7.4 符串常量。
是用双引号括起来的一串字符。合法的:“3”, “3a”,”3a\t\\b\r\x33\12”等。常考字符串的长度大小为多少。
1.8 转义字符的合法形式
合法的转义字符如下:
1、八进制转义序列:\0
\ + 1到3位数字;范围'\000'~'\377'
\0:空字符
十六进制转义字符\x
它是由反斜杠\和字母x(或X)及随后的1~2个十六进制数字构成的字符序列
(八进制转义字符和十六进制转义字符,不在前面加0!)
2、Unicode转义字符:\u + 四个十六进制数字;0~65535
\u0000:空字符
3、特殊字符:就3个
":双引号
':单引号
\:反斜线
4.控制字符:5个
\r 回车
\n 换行
\f 走纸换页
\t 横向跳格
\b 退格