1.C语言的数据类型 1byte == 8bit
基本类型:系统分配给基本类型的变量的内存大小固定
整型
(unsigned) short 2字节
(unsigned) int 4字节
(unsigned) long 8字节/4字节
实型(浮点型)
单精度实型 float 4字节
双精度实型 double 8字节
字符型
(unsigned) char 1字节♥构造类型:系统分配给构造类型变量的内存大小,取决于该类型具体时如何定义的
数组类型
结构体类型
联合体型(共用体)
枚举类型♥指针类型
*空类型(无类型)
void
2.常量和变量
常量:在程序运行期间,其值不能被改变的量称为常量
如:1 2 3.1415926
3 = 4; // error 3是一个常量,其值不能被改变,3要是能变成4,岂不是不三不四!变量:一个可以被改变的量
变量实质上时内存中具有特定属性的存储单元,它是用来存放数据。这个存储单元中的数据,就是变量的值,而这个值在程序运行期间可以被改变(赋值)。变量名:变量的名字
⭐系统把内存以一个字节为单位划分成很多份进行编号,这个编号就是地址(无符号整数),即每增加一个字节地址加1。操作系统访问哪个内存单元时,就必须要知道它的地址。
在定义变量时,会在内存分配空间(大小根据变量的类型决定),这时变量名就与该空间的首地址关联,即操作系统由变量名去指导该内存空间的地址。变量的定义:
数据类型 变量名;eg: int a; // 定义了一个 int 型的变量a,其空间大小是4字节
"数据类型":所有的C语言合法的类型都可以
"变量名":给存储数据的哪个对象(变量)取个名字,来代表它
⭐在C语言中,不管你是给什么东西起名字,都必须要符合C语言标识符命名规则:
C语言标识符必须由字母、数字、下划线组成,且第一个字符必须是字母或者下划线。int 3coutrt; // error 数字开头
int score+; // error 包含了 +
int count3; // 正确
int _score; // 正确编程规范:
(1)变量名取名时避免以下划线开头,因为下划线开头的符号一般用于编译器编译的符号。
(2)给对象(变量)取名时,尽量做到“见其名知其意”
(3)标识符不能是C语言保留的关键字
int short; // error short是关键字
int Short; // 正确
(4)C语言是区分大小写
eg: count 和 Count 是两个不同的意思
(5)在ANSI标准中,"nin-lengh && max-information" (最短的长度表达最多的信息)变量的访问(读/写)
(1)从变量中取值(读)。实际上是通过变量名找到相应的内存地址,从该地址对应的存储单元中读取数据。 这时变量一般在赋值符号(=)的右边,表示变量的值,我们称为右值。
(2)给变量赋值(写)。实际上是通过变量名找到对应的内存地址,把数值写到地址对应的存储单元中去, 覆盖掉原来的值,这时变量一般在赋值符号(=)的左边,表示变量的内存单元,我们称为左值。
int a;
int b;
a = b; // a是表示变量的内存单元,b是变量的值我们把给变量第一次赋值叫做初始化,若变量没有初始化,该值???
(a)随机值 (b)0常变量:定义时用 const 修饰的变量。初始化后不能再赋值的变量,即只读变量。
eg: const int c=3;
c = 250; // error
3.整型数据
整型常量:
十进制数 1,2,3,99,250 %d(格式控制符)
八进制数 以0开头的数据 0666 %o
十六进制数 以0x开头的数据 0x12,0x99,0xff %x整型变量:
⭐整型数据在内存中是以二进制的补码形式存放的,且最高位为符号位
1) 1表示负数,0表示正数,其他位为数值位
2)"补码"
正数:原码,即直接转化成二进制
负数:该值的绝对值的原码取反加1
(1)可以推出 short 的表示范围为 -2^15 ~ 2^15-1 2^15=32768
(2)short a=32767; // 32767=2^15-1
a = a + 1; // 数据溢出
printf("%d\n", a); // -32768
(3)当编译器以无符号整数输出(%u),就没有符号位的概念了,全部当作数值位
转化为十进制数输出。⭐无符号和有符号的本质区别:
当CPU把数据进行计算时,需要把变量的数据拷贝到CPU内部的寄存器(32bit),
当变量的数据小于32bit位时,有符号的数据拷贝到寄存器最高位补符号位,
无符号的数据拷贝到寄存器最高位补0。⭐%u 和 %d 都是以 int 型的十进制形式打印
⭐C语言各整数之间赋值问题:
长->短:sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long)
只保留低字节
例如:
short a = 0xc1d1; // 1100 0001 1101 0001
char b = a; // 1101 0001
短->长:char->int char->short short->int
unsigned(无符号):低字节直接拷贝,高位补0
signed(有符号):低字节直接拷贝,高位补符号位
4.浮点型数据
单精度 float 32bits %f
双精度 double 64bits %lf(1)注意:小数保存在内存中,有可能保存的是近似值
(2)浮点型和零的判断
float b;
#define ESP 0.00000001
if(b <= ESP && b >= -ESP) // 浮点型数据和零的比较 (只能无限接近于0,不能直接等于0)
5.字符型数据
(usnigned ) char 8bits %c
在内存中,字符型的变量存储的实际是一个小于255的整数数据,这个数据就是字符的ASCII值
把字符为两类:
(1) 普通字符: 可以打印的字符,有形状
如:
'a' ~ 'z'
'A' ~ 'Z'
'0' ~ '9'
...
char a = 'a' ;
(2) 特殊字符(转义字符):不可以打印的字符,没有形状
'\n' : 换行符
'\r' : 回车符
'\t' : 制表符'\\' 反斜杠
'%%' %
...
'\ooo': 由\后跟1个、2个、3个八进制数字组成,
这些八进制数字用来所期望的字符的ASCII码
6.字符串数据 %s
字符串常量是用 "" 括起来的,如:"abcd"、"123456"...
字符串保存在内存中时,其末尾一定有一个 结束标识符'\0'(它的ASCII就是0)
字符串没有对应的基本类型,字符串是用字符数组来保存的。
eg: printf("i like %s\n", "zhoujielun");字符常量 和 字符串常量 是不一样的
字符常量 表示的是单个字符, 用 单引号 引起来
如: '0'
字符串常量 表示的是一串字符, 用 双引号引起来
如: "0"
总结:
数据以补码形式存在,以原码输出
1.先判断数据类型(字节大小)(有符号无符号)
无符号:低字节直接拷贝,高位补0
有符号:低字节直接拷贝,高位补符号位
2.通过数据类型求补码
正数:原码,直接转换成二进制
负数:该值的绝对值的原码取反加一
3.判断打印方式%d,%u
%d:有符号转化成原码(减一取反)
%u:无符号转化成原码(正数原码补码一样)