算数操作符
在C语言中,%只能针对 整数 进行.
%不能对0求,如果编译器能够检查出/0了,那么就会编译期报错,如果检查不出来,就运行时报错.
如果除数时常量,能检查出来,除数是变量(int b = 0, 5 / b ),编译器无能为力.
计算除法基于CPU, CPU执行到当前这个除以0的指令的时候,就会产生一个中断,此时操作系统 就会检测到这个中断,就会给对应的进程发送一个信号,导致这个进程异常终止.
C中整数除以整数,结果还是整数.
直接把小数部分给舍弃了,没有四舍五入
如果两个不同的类型的变量进行算术运算,就会触发隐式类型转换, 内置的转换规则为 短的往长的转.
#include<stdio.h>
int main(){
double a = 5.0;
int b = 2;
printf("%f",a / b);
return 0;
}
强制类型转换(显示类型转换)
#include<stdio.h>
int main(){
int a = 5;
int b = 2;
printf("%f",(double)a / (double)b);
return 0;
}
移位操作符
(针对二进制)
1.左移运算 <<
10=>1010(二进制)
左移一位之前:
0000 0000 0000 0000 0000 0000 0000 1010
左移一位后:
0000 0000 0000 0000 0000 0000 0001 0100
1010 << 1 = 10100
10100 => 20
左移二位后: 101000 => 40
每次左移一位相当于 * 2
2.右移运算 >>
(1) 算术右移:最低位舍弃,整体往右挪一位,最高位补符号位.
(2)逻辑右移:最低位舍弃,整体往右挪一位,最高位补0. (C语言中不支持)
符号为正负号,
计算机表示一个负的整数:拿最高为作为符号位.
如果符号位为0,表示是整数.如果符号位为1,表示是负数.
-10 二进制表示:
1000 0000 0000 0000 0000 0000 0000 1010(大概就是这样)
10二进制右移一次:
0000 0000 0000 0000 0000 0000 0000 0101
101 => 5
针对算术右移操作,右移一位,相当于除以2
遇到考试/面试题时候如果在代码中,需要计算乘除2 ^ n,就可以等价转换成移位运算~
*4 就可以转换成<< 2.
实际开发角度就不需要转换,代码可读性优先.
位操作符
1.& 按位与
2.| 按位或
3.^ 按位异或
4.~ 按位取反
把两个操作数的对应的二进制位进行按位运算.
&,如果两个位都是1,结果为1,否则为0
|,如果两个位都是0,结果为0,否则为1
^,相同为0,相异为1.
~,针对一个操作数来进行计算的,针对每一位0 -> 1,1 -> 0
a = 1 0001
b = 2 0010
a & b 0000
a | b 1100
a ^ b 0011
#include<stdio.h>
int main(){
int a = 1;
int b = 2;
printf("%d\n",a&b);
printf("%d\n",a|b);
printf("%d\n",a^b);
printf("%x\n",~<