操作符详解(1)

算术操作符其实就是加,减,乘,除

移位操作符其实就是左移操作符,右移操作符 << >>

位操作符 按位或| 按位与& 按位异或^

算术操作符

+

-

*

\

%

加 减 乘 除 取模

对于除号

整形的除法 1/2 商0 余1

浮点型的除法 1.0/2 0.5 想要实现浮点数的除法,必须里面有1个是浮点数

1/2.0 1.0/2.0

取模操作符 :计算的整除后的余数

#include<stdio.h>
int main()
{
	int c = 7 % 2;
	int w = 6 / 3;
	printf("%d\n%d", c, w);
	return 0;
}

取模操作符的两端必须是整数

移位操作符

移动操作符移动的是二进制位数

十进制

0到9组成

八进制

0到8组成

二进制

0和1组成

十六进制

0到9 a到d表示

整数的二进制表示有3种

原码,反码,补码

正的整数的原反补码都相同

负的整数的原反补码需要进行计算

7是整数,4个字节,32个bit位

7写成二进制位数

0000 0000 0000 0000 0000 0000 0000 0111

7的最高位是0表示他是正数

最高位为1表示他是负数

0000 0000 0000 0000 0000 0000 0000 0111 原码

0000 0000 0000 0000 0000 0000 0000 0111 反码

0000 0000 0000 0000 0000 0000 0000 0111 补码

-7

100000000000000000000000000000000111

根据负7的二进制序列直接写出他的原码

反码,原码的符号位不变,其他位按位取反就是反码

111111111111111111111111111111111000

补码:原码的基础上加1

111111111111111111111111111111111001

整数在内存中存储的是补码

所以说移位操作符移的是我们内存中的补码

左移操作符的规则

左边丢弃,右边补0

如果是负数呢

-7

100000000000000000000000000000000111原码

111111111111111111111111111111111000反码

111111111111111111111111111111111001补码

-7<<1

移动操作符移动的补码

也就是-7的补码

右边补0,左边丢弃

111111111111111111111111111111111001 补码

111111111111111111111111111111110010 补码移动完的样子

因为我们看到的都是原码,这时候 就要把这个补码换算成反码然后就是原码

111111111111111111111111111111110001反码

100000000000000000000000000000001110 原码

得到的答案是-14

负数左移一位相当于原本的值乘以2

float f 3.14

注意左移右移操作符只针对整数

上面我们讲的是左移操作符

下面我们讲右移操作符

算术移位:右边丢弃,左边补原符号位

逻辑移位 :右边丢弃,左边补0

右移一位7是怎么移的 (因为是正数所以原反补相同)

0000 0000 0000 0000 0000 0000 0000 0111(补码)

0000 0000 0000 0000 0000 0000 0000 0011 移位移成这样,不管采用逻辑移位还是算术移位都是补0

#include<stdio.h>
int main()
{
	int c=7>>1;
	printf("%d\n",c);
	return 0;
}

要想测试移位操作符用的是哪种移位方法

把负数右移测试就可以了

假设我们用-7

如果是算术移位

右边丢弃,左边补原符号位

100000000000000000000000000000000111

111111111111111111111111111111111000

111111111111111111111111111111111001(补码)

拿到了补码

这时候右移

原符号位因为是负数补1

111111111111111111111111111111111100(补码右移完了)

这时候要换算成原码

先反码

111111111111111111111111111111111011

再原码

100000000000000000000000000000000100

这时候得到的值是-4

如果算出的是-4就是算术移位

如果是逻辑移位

还是-7

1000000000000000000000000000000000111

1111111111111111111111111111111111000

1111111111111111111111111111111111001(补码)

这时候右移(是使用逻辑移位)

右边丢弃,左边直接补0

0111111111111111111111111111111111100(补码)

0111111111111111111111111111111111011 (反码)

0000000000000000000000000000000000100(原码)

这时候得到的是4

如果是4就是逻辑移位

#include<stdio.h>
int main()
{
	int c=-7>>1;
	printf("%d\n",c);
	return 0;
}

算出来是-4所以vs使用的是算术移位

一般都是算术移位

注意移位的时候不要移动负数,移动负数是编译器都不知道怎么办的,是未定义的

(编译器直接无语:你小子想让我干啥)(什么移动浮点数位什么都不要想,只能移动整数)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值