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
警告
移位操作符不能移动负数位
今天的分享就到这儿了!希望可以帮助到大家!