关于c:C入门程序中的运算

6次阅读

共计 3422 个字符,预计需要花费 9 分钟才能阅读完成。

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,后果依然是 int
prinf("c = %d\n", c);     // c = 0

c = a % b;    // 计算失去登程的余数,只能作用于整型数
prinf("c = %d\n", c);     // c = 1

double a = 5;
double b = 2;
double c = 3;

c = a / b;    // 两个浮点数的除法,大类型为 double,后果依然是浮点数 double
prinf("c = %f\n", c);     // c = 2.5

c = 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 = 0

c = 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;    // 0001
short b = 2;    // 0010
int X = a - b;    // a - b = -1 short; 因为 - 1 在 int 能示意的范畴内,所以隐式转换不会出问题
                // 从二进制层面来说,short 类型的 - 1 转换到 int 类型的 -1,须要在高位补符号位,// 即要补高 16 位的 1,二进制值为 11...11,十进制为 -1
printf("X = %d\n", X);    // X = -1;

X = X >> 4;        // -1 >> 4,低位舍弃,高位补符号位,依然是 11...11,-1
printf("X = %d\n", X);    // X = -1;

X = X * -1 * 16 >> 4;   // 单 算 移 比 按 逻 三 赋
                        // -1*-1*16 = 16;16 >> 4,左边挪动,高位, 补符号位,所以是 00...0001,1
printf("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 0000
1)符号位:1
2)绝对值(二进制):1000 0000
3)按位取反:0111 1111
4)加 1:1000 0000(补码)// 另,-128,-32768 等这几个正数比拟非凡,在计算机中没有原码和反码,只有补码来示意,二进制位等价于 -0。// 十进制数 -10 的二进制示意:1111 0110
1)符号位:1
2)绝对值(二进制):0000 1010
3)按位取反:1111 0101
4)加 1:1111 0110(补码)// 如果一个二进制位示意的是一个十进制整数,通过符号位得悉是个正数,则能够按相同的运算形式进行推算。// 二进制 1111 0110 到十进制数的转换:-10
4)减 1:1111 0101
3)按位取反:0000 1010
2)绝对值(十进制):10
1)加上符号位:-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 语言入门课程》。
如有错漏之处,恳请斧正。

正文完
 0