有符号数和无符号数
在C语言中, 整数是可以带符号的(有符号,signed)或不带符号的(无符号,unsigned)。这两种类 型的整数在内存中以二进制形式表示。并使用不同的模式。 有符号数(Signed Numbers) 有符号数是来表示正数、负数、0的整数类型。
在内存中,有符号数使用最高位(通常是符号位) 来表示正负。如果最高位为0,表示这个数是正数或0,如果最高位为1,表示这个数是负数。其余 位用于表示数值本身。
举例:例如一个8位有符号整数可以表示的范围是-128 ~ 127 。这是因为1位用于表示符号(正或 负),剩下的7位用来存放数据
注意:有符号位是默认的。
在C语言中,基本整数类型如int,short,long默认为有符号数,除非明确 指定为无符号。
在创建有符号数时默认省略signed关键字
无符号数(Unsigned Numbers) 无符号数是只能表示非负整数的数据类型。
在内存中,无符号数不使用符号位,所有位都用于表示 数值。因为,无符号数的范围比有符号数的范围更大。
注意:在C语言中,通过关键字后添加 unsigned 。来指定无符号类型,如 short.. 举例:例如一个8位无符号整数可以表示的范围是 0 ~ 255 。这是因为所有8位都用来表示数值, 没有符号位。
运算符补充
位运算符
说明:按位(bit) 来进行运算操作的运算符。
语法:~ & | ^ >
~: 按位取反
说明:单目运算符,数据的每一个bit位取反,也就是二进制数位上的1变0,0变1。
举例: &: 按位与 语法:a & b 说明:首先将参与计算的操作数转换为二级制,然后按照每一位进行对齐
如果我们前后两个操作数对齐位置上的二进制数字都是1,其结果是1,否则结果都是0
|: 按位或
语法:a | b
说明:首先将参与计算的操作数转换为二级制,然后按照每一位进行对齐,处理结果如下:
如果我们前后两个操作数对齐位置上的二进制数字只要有1,其结果是1,否则结果都是0
^: 按位异或
语法: a ^ b
说明:首先将参与计算的操作数转换为二级制,然后按照每一位进行对齐
总结:不同为1,相同为0
<<: 左移,按 bit 位往左偏移
无符号左移
语法: 操作数 << 移动位数(bit位)
unsigned int a = 1 << 1;
//定义一个无符号整数a,将a左移1位(此时是将1转换为二进制再移位)
有符号左移
语法: 操作数 << 移动位数(bit位)
int a2 = -1 << 1;
/*定义一个有符号整数(系统默认定义的整数为无符号数,可以省略signed关键字)
将-1转换为二进制左移一位*/
>>: 右移,按 bit 位往右偏移
无符号右移
语法: 操作数 >> 移动位数(bit位)
unsigned int a = 1 >> 1;
//定义一个无符号整数a,将a右移1位(此时是将1转换为二进制再移位)
有符号右移
语法: 操作数 >> 移动位数(bit位)
int a2 = -1 >> 1;
//定义一个有符号整数将-1转换为二进制右移一位
注意
在进行移位运算的时候,凡是被移出去的位统统丢弃,凡是空出来的位统统补0。移位运算针对的 是无符号整数.
如果非要进行有符号的移位运算,那么左移的时候,空出来的补0,右移的时候,空出来的补符号 位(原码阶段)
其他运算符
赋值运算符
包含:
= :由右向左赋值。
注意:赋值运算符的左边(左操作数)必须是可写的地址。
复合赋值运算符
包含: += -= *= /= %= ,由右向左。
int i = 1;
i+=1;
// 等价于 i = i+1
i -=1;
// 等价于 i = i-1
i*=1;
// 等价于 i = i * 1
三目运算符
语法: 表达式1?表达式2:表达式3
其实就是if.else.简化版。
求值顺序: 如果表达式1的值为1,则整个条件运算表达式的值为表达式2的值; 如果表达式1的值为0,则整个条件运算表达式的值为表达式3的值。
C 语言程序设计结构
C 语言设计的核心(灵魂)
程序 = 数据结构 + 算法
算法:对于问题解决的方法思路或者步骤
算法的特征
有穷性:问题需要在有限的步骤内完成
可行性:解决步骤和方法思路必须要切实可行
确定性:每一个代码指令要有明确的功能含义
算法的描述:流程图
C 语言程序设计的设计结构
三大结构:顺序结构、分支(选择)结构、循环结构
顺序结构
说明:各操作是按先后顺序执行的。是最简单的一种基本结构。这个也是默认的结构。
选择结构
说明:又被称之为分支结构,根据条件是否成立,选择对应的操作。
循环结构
说明:又被称之为重复结构
当型循环
特点:先判断条件,后执行语句,语句可能一次也得不到执行
直到型循环
特点:先执行语句,后判断条件,语句至少执行一次
C 语言的语句分类
控制语句:while. for. if.else . .
函数调用语句:scanf( .);
表达式语句:b=3;
空语句:;
复合语句:{ .}
输入输出语句(printf()/scanf());
输入输出缓冲机制
概述
缓冲区又称为缓存,它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间, 这些存储空间用来缓冲输入 或者输出的数据,这部分预留的空间叫做缓冲区。缓冲区根据其对应的是 输入设备还是输出设备,分为 输入缓冲区和输出缓冲区
缓冲区的优点
1.减少IO设备的操作
2.提高计算机的运行速度。
缓冲区的类型
全缓冲:当填满缓冲区之后,才会进行实际IO操作。
行缓冲:当在输入和输出中遇到换行符时,执行真正的IO操作,也就是冲刷缓冲区的数据。比如键盘 输入数据
不带缓冲:也就是不进行缓冲,标准出错情况stderr是典型代表,这使得出错信息可以直接尽快地显示 出来。
引发缓冲区的刷新
1、遇到换行符\n
2、缓冲区满(溢出)
3、执行fflush(stdout),手动刷新缓冲区