算术操作符:+、-、*、/、%
int main()
{
//操作符(运算符)
int ret = 10 / 3;
//备注:对于除法操作符来说,两边的操作数都是整数,执行的是整数除法
//如果想计算出小数,除号的两端至少要有一个操作数是浮点数
double ret2 = 10.0 / 3;
printf("%d\n", ret);
printf("%.1lf\n", ret2);
return 0;
}
取模计算的是整除之后的余数,取模操作符的两边的操作数只能是整数
移(2进制)位操作符
2进制:整数的2进制表示形式其实有三种,原码、反码、补码。
内存中存储的起始是:补码的二进制,所以在进行移位操作的时候,移动的都是补码
左移操作符:
int main()
{
//按照一个数的正和负直接写出它的二进制表示形式得到的就是原码
//
//正数
//正数的原码、反码、补码是相同的
//负数的原码、反码、补码要经过计算
//反码的符号位不变,其他位按位取反就是反码
//补码就是反码+1
//整型占四个字节(32bit)
//00000000000000000000000000001010-原码
//00000000000000000000000000001010-反码
//00000000000000000000000000001010-补码
int a = 10;
//10000000000000000000000000001010-原码
//11111111111111111111111111110101-反码
//11111111111111111111111111110110-补码
int b = -10;
return 0;
}
原码到补码,取反+1
补码到原码,取反+1
int main()
{
int a = 10;
//00000000000000000000000000001010-补码
int b = a << 1;//左移1位
//00000000000000000000000000010100
printf("%d\n", b);
printf("%d\n", a);
return 0;
}//输出20、10
int main()
{
int a = -10;
//10000000000000000000000000001010-原码
//11111111111111111111111111110101-反码
//11111111111111111111111111110110-补码
int b = a << 1;
//11111111111111111111111111101100-b的补码
//10000000000000000000000000010011
//10000000000000000000000000010100-b的原码
printf("b=%d\n", b);
printf("a=%d\n", a);
return 0;
}
右移操作符: 分为算术右移和逻辑右移
算术右移:右边丢弃,左边补原来的符号位
逻辑右移:右边丢弃,左边直接补0
int main()
{
int a = -1;
//10000000000000000000000000000001
//11111111111111111111111111111110
//11111111111111111111111111111111-补码
int b = a >> 1;
printf("b=%d\n", b);
printf("a=%d\n", a);
return 0;
}//输出b=-1,a=-1
移位操作符<<、>>后面不能跟负数
位操作符有:按位与、按位或、按位异或
赋值操作符:=
复合赋值符:+=、-=、/=……
单目操作符:只有一个操作数的
! :逻辑反操作
-:负值
+:正值
&:取地址
sizeof :操作数的类型长度(以字节为单位)
~:对一个数的二进制按位取反
--:前置、后置--
++:前置、后置++
*:间接访问操作符:间接访问操作符(解引用操作符)
(类型):强制类型转换
双目操作符:有两个操作数的
布尔类型:就是用来表示真假的类型