一、C语言数据类型 基本类型:系统分配给基本类型的变量的内存空间大小固定 整型 (unsigned) short 2字节 (unsigned) int 4字节 (unsigned) long 4字节 实型(浮点型) 单精度实型 float 4字节 双精度实型 double 8字节 字符型 (unsigned) char 1字节 ☆构造类型:系统分配给构造类型的变量的内存大小,决定于该类型具体是怎样定义的 数组类型 结构体类型 联合类型(共用体) 枚举类型 ☆指针类型 * 空类型(无值类型) void 二、常量与变量 常量:在程序运行期间,其值不能被改变的量,称为常量 如 1 2 3 3.14 3 = 4; //error,3是一个常量,其值不能被改变 变量: 一个可以改变的量 变量实质上是内存中一个具有特定属性的存储单元,它是用来存放数据的。这个存储单元中 的数据,就是变量的值,而这个值在程序运行期间可以被改变(被赋值)。 变量名: 变量的名字 ★系统把内存以一个字节为单位划分成许多份进行编号,这个编号就是地址(无符号32位整数), 即每增加一个字节地址加1。操作系统访问内存哪个单元时,必须要知道它的地址。 在定义变量时,会在内存分配空间(大小根据变量的数据类型),这时变量名就与该空间的首地址 关联起来,即系统由变量名可以知道内存空间的地址。 变量的定义 数据类型 变量名; eg: int a; "数据类型":所有的C语言合法的类型 "变量名":给存储数据的那个对象(变量)取个名字 ★在C语言中,不管你是给什么对象取名字,都必须要符合C语言标识符的命名规则 C语言标识符必须由字母、数字、下划线组成,且第一个字符必须为字母或下划线。 建议:给对象取名,尽量做到"见其名知其义"。 变量的访问(读/写) (1)从变量中取值(读),实际上是通过变量名找到相应的内存地址,从该地址对应的存储单元中 读取数据。这时变量一般在赋值号(=)的右边,表示变量的值,我们称为 右值。 (2)给变量赋值(写),实际上是通过变量名找到相应的内存地址,把数值写到该地址对应的存储单元 中去,覆盖原来的值,这时变量一般在赋值号(=)的左边,表示变量的内存空间,我们称为 左值。 给变量的第一次赋值,我们叫做初始化,变量没有初始化,其值是不确定的。 常变量: 定义时用const修饰的变量,初始化后就不能再赋值,即为只读变量。 const int a=3; a = 4;//error 三、整型数据 整型常量: 十进制数 1,2,3,99 %d(格式控制符) 八进制数 以0开头的 0664 %o 十六进制数 以0x开头的 0x12 %x 整型变量 ★整型数据在内存中是以二进制的补码形式存放的,且最高位为符号位,1表示负数, 0表示正数,其它位为数值位。 "补码": 如果存储的数是正数,则就是原码(直接转化为二进制) 如果存储的数是负数,则绝对值的原码取反加1 (1)当编译器以整型输出时(%d),是以补码还原的方式来解读。 (2)当CPU把数据进行运算时,直接以内存中存储的方式进行运算,即补码的形式 (3)当编译器以无符号整型输出时(%u),就没有符号位的概念了,全部都是数值位, 直接转化为十进制输出。 C语言各整型之间的赋值的问题 长->短: int=>short short=>char int=>char 只保留低字节 短->长: unsigned:低字节直接拷贝,高位补0 signed:低字节直接拷贝,高位补符号位 有符号和无符号的本质区别: 数据拷贝到CPU内部寄存器的方式不同:signed高位补符号位,unsigned高位补0 (1)unsigned char a=255; char b=255; printf("%d %u\n",a,a);//255 255 printf("%d %u\n",b,b);//-1 4294967295 (2)unsigned short a=-1; int b = a; printf("%d\n",b);// 四、浮点型数据 单精度 (float 32bits) %f 双精度 (double 64bits) %lf 五、字符型数据 %c man ascii char ,unsigned char (8bits) 在内存中字符型数据的存放,实际上存放的是ASCII码(给每个字符一个整数值) 字符常量 '' 'a' '1' '+' '?' '\n' 换行 '\t' 横向跳格(Tab横向制表) '\r' 回车,回到本行行首 '\\' 反斜杠 '%%' % '\ddd' ddd表示1到3位八进制数,打印效果为该数字对应的ASCII码的字符 '\xhh' hh表示1到2位十六进制数,打印效果为该数字对应的ASCII码的字符 字符串常量 "","abcdef" %s 每个字符串在内存中保存都会在末尾有一个终止符 '\0'(它的ASCII码就是0)