移位运算符、整形提升

移位运算符

移位运算符:<<(左移操作符)和>>(右移操作符).
<<:左移操作符,将左边的抛弃,右边补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

如果某个操作数的类型在上面这个列表中排名较低,那么首先要转换为另外一个操作数的类型后执行运算。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值