操作符之算术操作符与移位操作符(C语言)

1.算术操作符:

+ 、-、*、/、%

通过观察下列代码,我们发现,+、-、*与我们日常生活中的使用相同,这里我们重点来讨论一下 / 和 %

1、/(除法)

在除法运算中,若被除数与除数均为整型,则结果为商的部分;

在两个整数运算中C语言遵从的是(向0取整)法则,所谓向0取整就是在数轴上朝向0的方向取整

例如上述代码:5/4=1.25(数学运算)

5/4=1(C语言)

所以在C语言中, / 两边操作数都是整型时,结果会取整数,只有一边是浮点型时才能算出小数,如下图:

2、%(取模、取余)

在取模运算中取到的结果是两数相除之后所留的余数,取余运算两边的操作符只能是整数

2.移位操作符

移位操作符简介

在C语言中,移位运算符有双目移位运算符:<<(左移)和>>(右移);

<< 左移操作符:将一个二进制位的操作数按指定移动的位数向左移动,移出位被丢弃,右边移出的空位一律补0。

>>右移操作符:将一个二进制位的操作数按指定移动的位数向右移动,移出位被丢弃,左边移出的空位一律补0。

在弄清楚这些之前,我们需要了解原码,反码,补码

原码,反码,补码

整数在内存中存储的形式是补码的二进制。

整数的二进制表示:有3种(原码、反码、补码)

原码:直接根据数值写出的二进制序列就是原码(32位)

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

补码:反码加1,就是补码

整数分为正整数和负整数,正整数的原码,反码,补码均相同;负整数在内存中均是以补码的形式存储

例如:+1

原码:00000000 00000000 00000000 00000001

反码:00000000 00000000 00000000 00000001

补码:00000000 00000000 00000000 00000001

这就是所谓原码=反码=补码

接下来看-1

原码:10000000 00000000 00000000 00000001

反码:11111111 11111111 11111111 11111110 (除符号位外,其余取反)

补码:11111111 11111111 11111111 11111111 (反码+1)

最高位的1为符号位,表示负,0表示正

左移操作符<<

先上代码:

易知:10的二进制为1010,所以原码,反码,补码如下

原码:00000000 00000000 00000000 00001010

反码:00000000 00000000 00000000 00001010

补码:00000000 00000000 00000000 00001010

左移操作符是将补码向左移位,即左边丢弃,右边补0;

此时向左移一位,补码变为00000000 00000000 00000000 00010100,换算为十进制发现=20

接下来我们来看看负数的移位:

-10的原码,反码,补码如下,因为最高位为符号位

原码:10000000 00000000 00000000 00001010

反码:11111111 11111111 11111111 11110101

补码:11111111 11111111 11111111 11110110

此时向左移一位,补码变为11111111 11111111 11111111 11101100,由于打印的是原码,所以须将此补码反推化为原码

反码:11111111 11111111 11111111 11101101(补码+1)

原码:10000000 00000000 00000000 00010010(除符号位外,其余按位取反)

将原码换算为十进制= -20

右移操作符>>

先上代码(只演示负整数的,看完正整数的也会了,正整数的比较简单)

这是为什么呢,原因如下:

右移运算分为两类

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

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

我当前使用的编译器,采用的是算术右移

-10的原码,反码,补码如下,因为最高位为符号位

原码:10000000 00000000 00000000 00001010

反码:11111111 11111111 11111111 11110101

补码:11111111 11111111 11111111 11110110

此时向右移一位,补码变为11111111 11111111 11111111 11111011,由于打印的是原码,所以须将此补码反推化为原码

反码:11111111 11111111 11111111 11111010

原码:10000000 00000000 00000000 00000101

将原码换算为十进制= -5

警告

移位操作符不能移动负数位

今天的分享就到这儿了!希望可以帮助到大家!

  • 18
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值