移位操作符
<< 左移操作符
>> 右移操作符
注:移位操作符的操作数只能是整数。
1.1 左移操作符
移位规则:左边抛弃、右边补0
1.2 右移操作符
移位规则(首先右移运算分两种):
1. 逻辑移位:左边用0填充,右边丢弃
2. 算术移位:左边用原该值的符号位填充,右边丢弃
位操作符
位操作符有:
& 按位与 | 按位或 ^ 按位异或
注:他们的操作数必须是整数。
使用位操作,不创建临时变量,实现两个数的交换:
#include <stdio.h>
int main()
{
int a = 10;
int b = 20;
a = a^b;
b = a^b;
a = a^b;
printf("a = %d b = %d\n", a, b);
return 0;
}
用位操作求一个整数存储在内存中的二进制中1的个数。
#include <stdio.h>
int main()
{
int num = -1;
int i = 0;
int count = 0;//计数
while(num)
{
count++;
num = num&(num-1);
}
printf("二进制中1的个数 = %d\n",count);
return 0;
}
单目操作符
只接受一个操作数的操作符:
! - & sizeof ~ ++ * (类型) | 逻辑反操作 负值 取地址 操作数的类型长度(以字节为单位) 对一个数的二进制按位取反 前置、后置++ 间接访问操作符(解引用操作符) 强制类型转换 |
整形提升
C的整型算术运算总是至少以缺省整型类型的精度来进行的。
为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。
例如
char a,b,c;
a = b + c;
b和c的值被提升为普通整型,然后再执行加法运算。
整形提升是按照变量的数据类型的符号位来提升的
负数的整形提升
char c1 = -1;
变量c1的二进制位(补码)中只有8个比特位:
1111111
因为 char 为有符号的 char
所以整形提升的时候,高位补充符号位,即为1
提升之后的结果是:
11111111111111111111111111111111
正数的整形提升
char c2 = 1;
变量c2的二进制位(补码)中只有8个比特位:
00000001
因为 char 为有符号的 char
所以整形提升的时候,高位补充符号位,即为0
提升之后的结果是:
00000000000000000000000000000001
(无符号整形提升,高位补0)