算数操作符
/ :除操作符
int main()
{
int a = 3 / 2;
printf("%d\n",a);
return 0;
}
除号两边的操作数都是整数,执行的是整数除法。如果要执行小数除法,必须保证除法的两端至少有一边为小数。
%:取模操作符
int main(0
{
int a = 9 % 2;
printf("%d\n",a);
return 0;
}
取模操作符两边的操作数必须都是整数。
%n它的取值范围是0~n-1。
移位操作符(操作二进制位)
<<左移操作符
>>右移操作符 (移位操作符的操作数必须是是整数)
首先要先了解二进制位
整数的二进制表示有3种形式:原码,反码,补码。
正整数的原码,反码,补码是相同的
负整数的原码,反码,补码是要计算的
以5举例:
int a=5;
00000000000000000000000000000101 原码
00000000000000000000000000000101 反码
00000000000000000000000000000101 补码
int a=-5;
10000000000000000000000000000101 原码
111111111111111111111111111111111010 反码(原码的符号位不变,其他位按取反得到的就是反码)
111111111111111111111111111111111011 补码(反码+1就是补码)
第一位是它的符号位。0表示正数,1表示负数。
整数在内存中存储的是补码的二进制。
左移:
int main()
{
int a=5;
int b=a<<1;
printf("%d\n",a);
printf("%d\n",b);
return 0;
}
左边丢弃,右边补0。左移之后值变为10。
如果a为-5:
左移后值为-10。
因为我们打印出来的值是由原码显示的,而存储的是补码,所以当值为负数时,我们要先将补码进行移位,再由补码推出我们的原码就是输出的值。
右移:
右移基本与左移相同,它的位移规则为:
算术右移:右边丢弃,左边补原符号位。
逻辑右移:右边丢弃,左边补0。
到底是算术右移还是逻辑右移取决于翻译器。
警告:对于移位运算符,不要移动负数位,这个是标准未定义的。
位操作符
& 按位与 对应的二进制位都为1则为1,否则为0
| 按位或 对应的二进制位都为0则为0,否则为1
^按位异或 对应的二进制位相同为0,相异为1
注:他们的操作数必须是整数。
单目操作符
sizeof
sizeof是一个操作符,不是函数,用来计算类型创建的变量所占内存的大小,单位是字节。
int main()
{
int a = 10;
short s = 0;
printf("%d\n", sizeof(s = a + 2)); 2
printf("%d\n", s); 0
return 0;
}
这里输出的结果是2和0,原因是sizeof中的表达式不参与计算。
注:sizeof在自定义的函数中不能正常工作,因为数组作为参数传递的话,数组名会隐式转换为指针,sizeof(数组名)的话,计算的就是指针类型的大小,指针类型的大小是取决于系统的,32位系统指针大小为4 64位系统指针大小为8。
#include<stdio.h>
void test1(int arr[])
{
printf("%d\n",sizeof(arr)); 4
}
void test2(char ch[])
{
printf("%d\n",sizeof(ch)); 4
}
int main()
{
int arr[10]={0};
char ch[10]={0};
printf("%d\n",sizeof(arr)); 40
printf("%d\n",sizeof(ch)); 10
test1(arr);
test(ch);
}