基本运算符
* /
int a = b*10; CPU可能多个周期,甚至要利用软件的模拟方法去实现乘法
int a = b+10; CPU一个周期可以处理
/取整
%取余
一般使用/和%配合得到小数,一般/的结果得到的是整数,除非:
float a,b,c,d;
a = 7 / 2;
b = 7.0 / 2;
c = 7 / 2.0;
d = 7.0 / 2.0;
printf("p is %f\n",a);
printf("p is %f\n",b);
printf("p is %f\n",c);
printf("p is %f\n",d);
输出:
p is 3.000000
p is 3.500000
p is 3.500000
p is 3.500000
0%3=0 1%3=1 2%3=2 3%3=0 4%3=1 ... ...
n % m = result [0 ~ m-1] //取余操作的结果范围就是0~m-1之间
用法:
取一个范围的数:
eg.给一个任意的数字,得到一个1到100以内的数字?
(m % 100)+1 ===> res;
得到M进制的一个个位数
循环数据结构的下标
逻辑运算
就是只有真和假,非0即真
A || B 等于 B || A 吗? 答案是不等于!
A && B 同理
由于C语言编译器是按照先后顺序进行一个预判断,然后再决定是否执行
A和B是个表达式,表达式也可以是个函数调用:
res = ((a == 10) || printf("=========\n"));
当a==10为真时,不执行后面的printf语句
res = ((a != 10) || printf("=========\n"));
当a==10为假时,才会执行后面的printf语句,最后res的结果还是为1
!:逻辑取反
对比位运算中的位取反
int a = 0x0;
!a;
if(!a){}; 执行!a后,if条件为真,就可以执行if后的东西,取非
~a;
0xffff 而位取反,是把a的所有位取反,最后a=0xffff
位运算
<< >> 左移右移
左移:乘法,* 2 二进制下的移位
m<<1; m*2
m<<n; m*2^n
4: 0 0 1 0 0
8: 0 1 0 0 0 整体往左移
int a = b * 32; 在计算机看来就是====> b<<5
负数乘法也是可以适用的:
-1 * 2 = -2
原码:1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0
取反:1 1 1 1 1 1 1 0 //符号位不变,其余取反 1 1 1 1 1 1 0 1
补码:1 1 1 1 1 1 1 1 //取反后+1 1 1 1 1 1 1 1 0
在计算机内存中-1的表示方式就是全1; ==== -2
左移后,末尾空出的那位默认填0
0x80的原码是1000 0000,补码还是1000 0000,因为符号位始终不会变,当进到第8位的时候,就溢出被舍弃
0000 0000:+0
0111 1111:+127
1000 0000:-0或-128
1111 1111:-127
右移:除法,/2
右移的最高位与符号变量有关
右移后,最高位空出来的默认是符号位,正数位0,负数为1
int a = xxx;
while(a){
a = a>>1;
}
prinf("-----------------\n")
只要a是负数,a就永远变不了0,因为符号位一直在那占着,因此printf无法执行到
a是负数时,最终内存会被1填充,
a是正数时则可变为全0,
逐位 与、或、异或
&、|、^
A & 0 = 0
&:屏蔽
int a = 0x1234;
a & 0xff00; 屏蔽低8bit,取出高8bit
A & 1 = 1
&:取出
&用的更多的是清零器
A | 0 = A
保留操作
A | 1 = 1
|用的更多的是将其当作设置高电平的方法
设置一个寄存器的bit5为高电平,其他位不变
int a;
a = (a | (0x1<<5)); 可以引申出====> a = a | (0x1<<n)
清除第五位
int a;
a = a & ~(0x1<<5); 可以引申出====> a = a & ~(0x1<<5)
异或、取反:^、~
一般交换两个数我们会使用:
int fun()
{
int a = 20;
int b = 30;
int c;
c = a;
a = b;
b = c;
此外还可通过异或来交换两个数:
a = a ^ b;
b = a ^ b;
a = a ^ b;
}
~
0xf0 ~ 0xffff ff0f //不同的系统对应不同的结果,不一定是32位整型常量
在上述的所有运算符中,都不具备赋值的能力,也就是说,原来变量的值不会变
赋值运算
只有 等号 具备更新能力
=、+=、-=、&=、......诸如此类...
内存访问符号
()
限制符 (a+b)*c
函数访问
int fun();
fun();
[]
数组
内存访问的ID符号:a[1] a[2]
{}
函数体的限制符
结构体的定义符号:struct abc{xxx}
-> .
对于连续空间,也就是自定义空间中,不同成员变量的访问方法
-> 地址访问
. 变量访问
& *
&p 取地址
a&0x1 与运算
*p 指针
a*10 乘法
标签:03,10,int,0x1,取反,C语言,运算符,printf
From: https://www.cnblogs.com/xishiyuyuan/p/18293287