移位运算符
移位运算符:<<(左移操作符)和>>(右移操作符).
<<:左移操作符,将左边的抛弃,右边补0
0000 0000 0000 0000 0000 0000 0000 0101——5
0000 0000 0000 0000 0000 0000 0000 1010——10——5x2^1
0000 0000 0000 0000 0000 0000 0001 0100——20——5x2^2
由此可见,左移操作相当于乘法,但是实际上,在没有被赋初值的情况下,即使移位,它的值也并不会改变。
>>:右移运算符
- 逻辑移位:右边丢弃,左边用0补充
- 算术移位:右边丢弃,左边用符号位补充
例如:num=-1,则在内存中为32个1
1111 1111 1111 1111 1111 1111 1111 1111——-1
逻辑移位为:0111 1111 1111 1111 1111 1111 1111 1111
算术移位为:1111 1111 1111 1111 1111 1111 1111 1111(补充的是符号位)
0000 0000 0000 0000 0000 0000 0000 1011——11
0000 0000 0000 0000 0000 0000 0000 0101——5——11/2^1
0000 0000 0000 0000 0000 0000 0000 0010——2——11/2^2
可见,右移操作相当于除法
#include<stdio.h>
//求一个数中二进制中1得个数,用移位得方法
int Function(int input)
{
int count = 0;
for (int i = 0; i < 32; i++)
{
if (((input >> i)&1) == 1)
{
count++;
}
}
return count;
}
int main()
{
int input = 0;
scanf_s("%d", &input);
printf("%d\n", Function(input));
}
(input>>i)&1
这句话可以判断2进制的每一位是0还是1
整形提升
C的整型算术运算总是至少以缺省整型类型的精度来进行的。
为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。
char,int,float,double字节大小各不相同,计算机在处理数据的时候,会先提升为int型数据
-
负数的整形提升:
char c1 = -1;
变量c1的二进制位(补码)中只有8个比特位:
1111 1111
因为 char 为有符号的 char
所以整形提升的时候,高位补充符号位,即为1
提升之后的结果是:
1111 1111 1111 1111 1111 1111 1111 1111 -
正数的整形提升:
char c2 = 1;
变量c2的二进制位(补码)中只有8个比特位:
0000 0001
因为 char 为有符号的 char
所以整形提升的时候,高位补充符号位,即为0
提升之后的结果是:
0000 0000 0000 0000 0000 0000 0000 0001
int main()
{
char a = 0xb6;
short b = 0xb600;
int c = 0xb6000000;
if(a==0xb6) //char类型,会整形提升,提升完为0xffffffb6
printf("a");
if(b==0xb600) //short类型,也会整形提升,提升完为0xffffb600
printf("b");
if(c==0xb6000000)//不用整形提升
printf("c");
return 0;
}
一般算术转换:
long double
double
float
unsigned long int
long int
unsigned int
int
如果某个操作数的类型在上面这个列表中排名较低,那么首先要转换为另外一个操作数的类型后执行运算。