算术操作符
+,—,* / %
- 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。
- 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法。
- % 操作符的两个操作数必须为整数。返回的是整除之后的余数。
移位操作符
右移操作符 >>
1.算数右移
右边丢弃,左边补原符号位
2.逻辑右移
右边丢弃,左边补0
通常都是算数右移,负数移位后还是负数
就是将一个数除于2
关于-1的右移 一位还是-1
int main() {
int a = -1;
//整数的二进制表示有:原码,反码,补码
//存储在内存的是补码
//正整数的三码是相同的
//-1的原码 10000000000000000000001
//求反码 111111111111111111111110
//补码是反码加1 111111111111111111111111
int b = a >> 1;
printf("%d\n", b);
return 0;
}
左移操作符跟右移差不多,就是将数乘于2
警告:不能移动负数位
位操作符
& 按位与
| 按位或
^ 按位异或
注:他们的操作数必须是整数
求一个整数存储在内存中的二进制中1的个数
# include<stdio.h>
int main() {
int num = 0,count=0;
scanf("%d", &num);
int i = 0;
for (i = 0; i < 32; i++) {
if (1 == ((num >> i) & 1))
count++;
}
printf("%d\n", count);
return 0;
}
赋值操作符
单目操作符
! 逻辑反操作
— 负值
正值 +
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
– 前置、后置–
++ 前置、后置++
间接访问操作符(解引用操作符) *
#include <stdio.h>
void test1(int arr[])
{
printf("%d\n", sizeof(arr));//(2)
}
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));//(1)
printf("%d\n", sizeof(ch));//(3)
test1(arr);
test2(ch);
return 0;
}
问:
(1)、(2)两个地方分别输出多少?
(3)、(4)两个地方分别输出多少?
40 10 4 4
第一个4乘于10
第二个 1乘于10
第三和四因为传进去的是一个首元素的地址,需要一个指针来接受,指针的大小为4和8