Summary
1)C语言中反对如下4种类型的运算:
运算类型 | 运算符 |
---|---|
四则运算 | +,-,*,/,% |
关系运算 | <,>,<=,>=,==,!= |
逻辑运算 | &&,!,II |
位运算 | &,I,^,>>,<<,~ |
2)运算符的优先级:单算移比,按逻三赋。如果不同类型的运算符同时呈现在一个表达式中,尽量用括号()指明运算程序。
3)逻辑运算的短路法令:对于&&运算,第一个为假的操作数之后的其余操作数都不再计算;对于||运算,第一个为真的操作数之后的其余操作数都不再计算。因而对于if表达式的逻辑表达式,肯定要思考到后续的操作数是否须要运算到。
4)十进制正数和二进制的互相转换规则如下:
- 1)符号位:
- 2)绝对值(二进制):
- 3)按位取反:
- 4)加1:
如果一个二进制位示意的是一个正数,那么推算的形式按上述规定逐渐相同。
5)在计算机中,不同数据类型的实质在于:
- a)占用的内存大小不同:如int占4字节,char占1字节
- b)示意数据的具体形式不同:如正整数用原码示意、负整数用补码示意;整数和浮点数的二进制示意办法不同。
6)位运算操作时的关键点:
- a)操作数的类型(占用的内存大小)
- b)符号位(0还是1)
- c)不同数据类型的运算要先对齐,再运算(补符号位进行对齐)
7)设置整数integer指定Bit位的值
规定如下:
- 置0:应用按位与(运算数n指定地位为0,其余为1,同integer进行&运算),如果对应地位为0,其余地位能够不变为1,这样运算数n能小一点,直观一些
- 置1:应用按位或(运算数n指定地位为1,其余为0,同interger进行|运算)
- 取反:按位异或(如一次指定多位取反)
1、四则运算
四则运算(+, -, *, /, %)
- 就是数学中的加减乘除等运算
- 遵循先乘除后加减的运算优先级
- 能够应用括号扭转运算程序
留神:
C语言中的除法运算,除数不能为0!
/和%都是除法。对于“/”,运算的后果和大类型统一。对于“%”,只能作用于整型数。
int a = 1;int b = 2;int c = 0;c = a / b; // 计算失去除法的商,大类型为int,后果依然是intprinf("c = %d\n", c); // c = 0c = a % b; // 计算失去登程的余数,只能作用于整型数prinf("c = %d\n", c); // c = 1double a = 5;double b = 2;double c = 3;c = a / b; // 两个浮点数的除法,大类型为double,后果依然是浮点数doubleprinf("c = %f\n", c); // c = 2.5c = a % n; // error,取余运算不能够作用于浮点型
2、关系运算
关系运算(<, >, <=, >=, ==, !=)
- 比拟两个值大小关系或相等关系的运算
- 比拟的后果为逻辑值:真(1)、假(0)
- 能够应用括号()扭转关系运算的程序
int a = 1;
int b = 2;
int c = 0;
// 对于多个运算符杂糅在一个表达式中,运算符优先级见summary 2)c = a - b >= a + b; // 等价于:c = (a - b) >= (a + b);prinf("c = %d\n", c); // c = 0c = a < b + c < b; // 等价于: c = (a < (b + c)) < b;prinf("c = %d\n", c); // c = 1
3、逻辑运算
逻辑运算(&&, ||, !)
- 逻辑运算的参与者为逻辑值(真或假)
- 任何非零值在逻辑运算中都为真
- 任何零值在逻辑运算中都为假
对于&&运算:运算数全1得1,否则为0;
对于||运算:运算数有1得1,全0为0;
对于!运算:单目运算符(只须要一个操作数),运算后果为;逻辑值;对真值取非的后果为假,对假值取非的后果为真;
- C语言中的真值对应于非零值,假值对应于零值。如:1、1.6、-1、-0.8均为真值;如0、0.0、-0等都是假值。
逻辑运算中的短路法令:
对于&&运算
- 从左向右进行,如果有一个操作数为假,则整个表达式为假
- 第一个为假的操作数之后的其余操作数不再计算
对于||运算
- 从左向右进行,如果有一个操作数为真,则整个表达式为真
- 第一个为真的操作数之后的其余操作数不再计算
4、位运算
位运算(&, |, ~, ^, <<, >>)
- 间接对数据的二进制位进行操作
- 位运算的根本单位是二进制位,所以也是一种0和1的操作
- 能够应用括号()扭转位运算的运算程序
- 位运算的操作数只能是整型数(浮点数不能进行位运算)
运算符 | 含意 | 示例 | 优先级 |
---|---|---|---|
~ | 按位求反 | ~0101 -> 1010 | 1(高) |
<< | 左移:高位移出,低位补0 | 0011 << 1 -> 0110 | 2 |
>> | 右移:低位移除,高位补符号位 | 0101 >> 2 -> 0001 | 2 |
& | 按位与 | 0111 & 1100 -> 0100 | 3 |
^ | 按位异或:雷同为0,不同为1 | 0111 & 1100 -> 1011 | 4 |
I | 按位或 | 0111 & 1100 -> 1111 | 5(低) |
运算符优先级:
4.0 位运算操作时的关键点
在计算机中,不同数据类型的实质在于:
1)占用的内存大小不同:如int占4字节,char占1字节
2)示意数据的具体形式不同:如正整数用原码示意、负整数用补码示意;整数和浮点数的二进制示意办法不同。
位运算操作时的关键点
- a)操作数的类型(占用的内存大小)
- b)符号位(0还是1)
- c)不同数据类型的运算要先对齐,再运算(补符号位进行对齐)
short a = 1; // 0001short b = 2; // 0010int X = a - b; // a - b = -1 short;因为-1在int能示意的范畴内,所以隐式转换不会出问题 // 从二进制层面来说,short类型的-1转换到int类型的-1,须要在高位补符号位, // 即要补高16位的1,二进制值为11...11,十进制为-1printf("X = %d\n", X); // X = -1;X = X >> 4; // -1 >> 4,低位舍弃,高位补符号位,依然是11...11,-1printf("X = %d\n", X); // X = -1;X = X * -1 * 16 >> 4; // 单 算 移 比 按 逻 三 赋 // -1*-1*16 = 16; 16 >> 4,左边挪动,高位,补符号位,所以是00...0001,1printf("X = %d\n", X); // X = 1;// 对于一个正整数,右移n位,X >> n,相当于除以2^n;左移n位,相当于乘以2^n// 数据符号位的具体位置由数据类型决定的,如char,最高位是第7位;int,最高位是第31位
4.1 正数的二进制示意办法
十进制正数和二进制的互相转换规则如下:
1)符号位:
2)绝对值(二进制):
3)按位取反:
4)加1:
示例如下(以1字节为例):
// 十进制数-128的二进制示意:1000 00001)符号位:12)绝对值(二进制):1000 00003)按位取反:0111 11114)加1:1000 0000 (补码)// 另,-128,-32768等这几个正数比拟非凡,在计算机中没有原码和反码,只有补码来示意,二进制位等价于-0。// 十进制数-10的二进制示意:1111 01101)符号位:12)绝对值(二进制):0000 10103)按位取反:1111 01014)加1:1111 0110(补码)// 如果一个二进制位示意的是一个十进制整数,通过符号位得悉是个正数,则能够按相同的运算形式进行推算。// 二进制1111 0110到十进制数的转换:-104)减1:1111 01013)按位取反:0000 10102)绝对值(十进制):101)加上符号位:-10
4.2 设置整数integer指定Bit位的值
规定如下:
- 置0:应用按位与(运算数n指定地位为0,其余为1,同integer进行&运算),如果对应地位为0,其余地位能够不变为1,这样运算数n能小一点,直观一些
- 置1:应用按位或(运算数n指定地位为1,其余为0,同interger进行|运算)
- 取反:按位异或(如一次指定多位取反)
示例如下:
// eg.1 设置整数5的第2个二进制位为1应用按位或形式:运算数n为 0000 0010 = 2,整数5为 0000 0101 0000 0010 2| 0000 0101 5 0000 0111 == 7 // eg.2 设置整数15的第2个二进制位为0应用按位与形式:运算数n为 0000 1101 = 2,整数15为 0000 1111 0000 1101 13& 0000 1111 15 0000 1101 == 13 // eg.3 设置整数a的两头4位取反,a = 0x10101101,运算数n应为多少?应用按位异或形式:运算数n为 0000 0010 = 2,整数a为 1010 1101 0011 1100 n,60^ 1010 1101 a,-83 1001 0001 == X,-111
本文总结自“狄泰软件学院”唐佐林老师《C语言入门课程》。
如有错漏之处,恳请斧正。