标签:ble print 显示 相加 为什么 有符号 个数 大于等于 执行
//c运算符 /* 运算符是一种告诉编译器执行特定的数学或者逻辑操作的符号,c语言提供的操作符如下: 1.算数运算符 2.关系运算符 3.逻辑运算符 4.位运算符 5.赋值运算符 6.杂项运算符 */ //1.算数运算符 /* 假设a的值为20,b的值为10 + 把两个操作数相加 结果:A+B=30 - 把两个操作数相减 结果:A-B=10 * 把两个操作数相乘 结果:A*B=200 / 把两个操作数相除 结果:A/B=2 % 去两个操作数的余数 结果:A%B=0 ++自增运算符,+1 结果:A++将得到21 --自减运算符,-1 结果:A--将得到19 */ #include <stdio.h> int main01() { int a = 20; int b = 10; int c; c = a+b; printf("a+b=%d\n", c); // a+b=30 c = a-b; printf("a-b=%d\n", c); // a-b=10 c = a*b; printf("a*b=%d\n", c); // a*b=200 c = a/b; printf("a/b=%d\n", c); // a/b=2 c = a%b; printf("a%%b=%d\n", c); //a%b=0 c = a++; printf("a=%d, c=%d\n", a,c); // a=21, c=20 为什么会是这个结果下面再说 c = b--; printf("b=%d, c=%d\n", b,c); // b=9, c=10 同上 } //关于a++和++a之间的区别 //c = a++表示先将a的值赋给c,再对a进行自增 //c = ++a表示先对a进行自增,再将自增之后的a赋给c int main02() { int a=10; int c; c = a++; printf("c=%d\n", c); //c=10 a = 20; c = ++a; printf("c=%d\n", c); //c=21 //可以看到上面c的值,并没有变,因为在自增之前已经将值赋给c了 //下面的值变了,因为是先自增,再赋值 } //2.关系运算符 /* 假设a的值为20,b的值为10 == 判断两个操作数是否相等 a==b不为真 != 判断两个操作数是否不相等 a!=b为真 > 判断左值是否大于右值 a>b为真 < 判断左值是否小于右值 a<b不为真 >= 判断左值是否大于等于右值 a>=b为真 <= 判断左值是否小于等于右值 a<=b不为真 */ int main03() { int a=20; int b=10; if (a==b) { printf("a==b\n"); } else if (a>=b) { printf("a>=b\n"); //a>=b } else { printf("a<b\n"); } } //3.逻辑运算符 /* && 逻辑与运算符,左右都为真才为真 || 逻辑或运算符,左右只要有一个为真,就为真 ! 逻辑非运算符,如果为真那么加上!就为假 */ int main04() { if (2>1 && 3>2) { printf("2>1 && 3>2为真\n"); //2>1 && 3>2为真 } if (2>1 && 2>3) { printf("2>1 && 2>3为真\n"); } if (2>1 || 2>3) { printf("2>1 || 2>3为真\n"); //2>1 || 2>3为真 } if (1>2 || 2>3) { printf("1>2 || 2>3为真\n"); } if (!(2>3)) { printf("!(2>3)为真\n"); //!(2>3)为真 } } //4.位运算符 /* 位运算符作用于位,并逐位进行操作 p q p & q p | q p ^ q 0 0 0 0 0 0 1 0 1 1 1 1 1 1 0 1 0 0 1 1 &:都为1,结果才为1 |:有一个为1,结果就为1 ^:相同为0,相异为1 假设A=60,B=13,用二进制表示就是 A = 0011 1100 B = 0000 1101 -------- A & B = 0000 1101 = 12 A | B = 0011 1101 = 61 A ^ B = 0011 0001 = 49 对于任意整数A,B 总有A|B = A&B + A^B 其实仔细一想也简单,A|B,是只要有1,那么结果就为1 A&B,是必须都为1,结果才为1,相较于A|B,可以为1的少了哪部分呢?对,就是相异的部分 A^B,相异才为1,那么相较于A|B,可以为1少了哪部分呢?对就是相同都为1的部分 所以A&B和A^B就是A|B的"全为1才为1"和"只有一个为1才为1"两部分 还有取反运算符~,按照二进制取反规则进行计算。 << 左移运算符,表示将一个二进制数向左移,低位补0 >> 右移运算符,表示将一个二进制数向右移,低位溢出不要,高位补0 */ int main05() { unsigned int a=60; unsigned int b=13; printf("a&b=%d\n",a&b); //a&b=12 printf("a|b=%d\n",a|b); //a|b=61 printf("a^b=%d\n",a^b); //a^b=49 printf("~a=%d\n",~a); //~a=-61 printf("a<<2=%d\n",a<<2);//a<<2=240 printf("a>>2=%d\n",a>>2);//a>>2=15 } //a<<n,将a左移n位,就相当于a * 2**n //a>>n,将a右移n位,就相当于a / 2**n //但是a=60,为什么~a=-61,难道不应该是-60吗?这就要从计算机对数字的存储方式说起了 /* 我们知道计算机是以二进制方式存储数据的 a = 60,在计算机中60的形式就是0011 1100 显示是以原码显示,但在运算的时候是以补码运算的。 正数:原码=反码=补码 负数:原码=反码的符号位不变,其他位取反。补码=反码+1 如果从补码求原码,反码=补码符号位不变,其他位取反。原码=反码+1。 记住,+1永远针对于反码来的,所以这里是+1,而不是-1。 对于负数:说明是有符号类型,那么最高位表示的是正负号,为1则是负数,为0则是正数 a = 0011 1100,那么~a = 1100 0011,注意此时还是补码,运算是以补码运算的。 但显示要转化成原码显示,1100 0011先转换成反码(最高位不变,其他位取反)得到1011 1100, 反码1011 1100 + 1得到原码,1011 1101。 因此a的原码是0011 1100 ~a的原码是1011 1101,最高位表示符号位,为1表示负数。 可以看到~a比a多了1,加上最高位的符号位,所以是-61 */ //5.赋值运算符 /* = 简单的赋值运算符,把右边操作数的值赋给左边操作数 C = A + B 将把 A + B 的值赋给 C += 加且赋值运算符,把右边操作数加上左边操作数的结果赋值给左边操作数 C += A 相当于 C = C + A -= 减且赋值运算符,把左边操作数减去右边操作数的结果赋值给左边操作数 C -= A 相当于 C = C - A *= 乘且赋值运算符,把右边操作数乘以左边操作数的结果赋值给左边操作数 C *= A 相当于 C = C * A /= 除且赋值运算符,把左边操作数除以右边操作数的结果赋值给左边操作数 C /= A 相当于 C = C / A %= 求模且赋值运算符,求两个操作数的模赋值给左边操作数 C %= A 相当于 C = C % A <<= 左移且赋值运算符 C <<= 2 等同于 C = C << 2 >>= 右移且赋值运算符 C >>= 2 等同于 C = C >> 2 &= 按位与且赋值运算符 C &= 2 等同于 C = C & 2 ^= 按位异或且赋值运算符 C ^= 2 等同于 C = C ^ 2 |= 按位或且赋值运算符 C |= 2 等同于 C = C | 2 */ int main06() { int a=20; int c; c = a; printf("c=%d\n", c); //c=20 c += a; printf("c=%d\n", c); //c=40, c = c+a,所以是40 c -= a; printf("c=%d\n", c); //c=20, c = c-a,所以40-20=20 c *= a; printf("c=%d\n", c); //c=400, c=c*a,所以20*20=400 c /= a; printf("c=%d\n", c); //c=20, c = c/a ,所以400/20=20 c = 210; c %= a; printf("c=%d\n", c); //c=10, 210%20=10 c <<= 2; printf("c=%d\n", c); //c=40, 10* 2**2 = 40 c >>= 2; printf("c=%d\n", c); //c=10, 40/ 2**2 = 10 c &= 2; printf("c=%d\n", c); //c=2, 10 & 2 --->0000 0110 & 0000 0010 = 0000 0010 = 2 c ^= 2; printf("c=%d\n", c); //c=0, 2 ^ 2 --->0000 0010 ^ 0000 0010 = 0000 0010 = 0 c |= 2; printf("c=%d\n", c); //c=2, 0 | 2 --->0000 0000 | 0000 0010 = 0000 0010 = 2 } //6.杂项运算符,sizeof & 三元运算符 /* sizeof() 返回变量的大小。 sizeof(a) 将返回 4,其中 a 是整数。 & 返回变量的地址。 &a; 将给出变量的实际地址。 * 指向一个变量。 *a; 将指向一个变量。 ? : 条件表达式 如果条件为真 ? 则值为 X : 否则值为 Y */ int main() { int a=4; short b; double c; int *p; printf("sizeof(a)=%d,sizeof(b)=%d,sizeof(c)=%d,sizeof(p)=%d\n", sizeof(a),sizeof(b),sizeof(c),sizeof(p)); //sizeof(a)=4,sizeof(b)=2,sizeof(c)=8,sizeof(p)=4 //可以看到int占4个字节,short占2个字节,double占8个字节,指针变量占4个字节 //求两个数中较大的一个 int m = 100; int n = 40; int max; if (m>n) { max = m; } else{ max = n; } printf("max=%d\n", max); //max=100 //还可以通过三元运算符 max = (m>n)?m:n; printf("max=%d\n", max); //max=100 //(m>n)?m:n,怎么理解呢?(m>n)?m,m大于n吗?大的话就是m,:n,不然就是n。 }
标签:ble print 显示 相加 为什么 有符号 个数 大于等于 执行
原文地址:https://www.cnblogs.com/traditional/p/9463617.html