【从饮水机到名人堂之c语言】操作符详解(1)-创新互联
前言:目录
前言:
一、操作符的分类
二、详解操作符
1.算术操作符
2.移位操作符
1.原码、反码、补码
2.左移位操作符
3.右移位操作符
三、位操作符
1.按位与&
2、按位或 |
3、异或^
总结:
一、操作符的分类我们前边对数组进行了系统 的学习,并且制作了三子棋游戏,相信大家对数组有了一个更为深入的了解,从今天开始,我们就要对操作符进行讲解。
算术操作符 |
移位操作符 |
位操作符 |
赋值操作符 |
单目操作符 |
关系操作符 |
逻辑操作符 |
条件操作符 |
逗号操作符 |
下标引用、函数调用与结构成员 |
分为+、-、*、/、%五个算术操作符,算术操作符比较简单,和我们数学中所学的相似,但是要注意的是C语言中的乘号为*,而不是x。
还有以下几点我们要切记:
1. 除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数。 2. 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要有浮点数执行的就是浮点数除法,即我们需要得到一个浮点数时,我们必须控制除数或被除数至少有一个为浮点型。 3. % 操作符的两个操作数必须为整数。返回的是整除之后的余数。 4.在使用 / 操作符过程中,也要记得除数不能为0。2.移位操作符
移位操作符分为:
左移位操作符<<
右移位操作符>>
移位操作符实质上是对数字的二进制位进行操作,这里我们就必须带着大家来学习一些有关二进制的知识。
1.原码、反码、补码原码就是我们要进行操作的数字转换为2进制后的形式,我们知道在32位操作系统下,一个整型为4个字节,即32个比特位,一个比特位就是一个0或者1的序列,计算机通过电势的高低来存储,0代表低电平,1代表高电平。
对于一个有符号类型的整数(unsigned int)来说最高位(即最左边的位)为符号位,1代表负号,0代表正号。
所以3和-5的原码就是:
00000000000000000000000000000011
10000000000000000000000000000101
了解了原码之后,那么什么是反码呢?
正数的反码就是原码本身,而负数的反码就是将这个数字的符号位除外的二进制序列按位取反之后所得到的二进制序列,什么叫按位取反呢?按位取反就是将每个比特位上的数,为0时改为1,为1时改为0。
所以3和-5的反码为:
0000 0000 0000 0000 0000 0000 0000 0011
1111 1111 1111 1111 1111 1111 1111 1010
补码也很简单,正数的补码就是原码本身,所以正数的原码反码补码都是相同的,而负数就是在反码的操作上加1。
所以3和-5的补码为:
0000 0000 0000 0000 0000 0000 0000 0011
1111 1111 1111 1111 1111 1111 1111 1011
在我们的内存中,存储的不是原码,而是这个数字的补码。
2.左移位操作符左移位操作符就是对一个二进制数最左边的数舍弃,最右边补0。
对数字n进行移位操作,可以表示为n<<1,在没有被赋值的情况下,n的值并不会发生改变,只有当n=n<<1时,n的值才会发生变化。
通俗的来说,左移操作符就是给这个数乘上2,左移几位,就会成上2的几次方,例如:a=3<<2,求得的值就是3*2的平方。
3.右移位操作符与左移位操作符有所不同,右移位操作符分为逻辑移位和算术移位,根据编译器的不同,可能在进行右移位时是逻辑移位,也可能是算术移位,逻辑移位就是将整个二进制序列向右移动,左边的空隙补上0,而算术移位则是将二进制序列向右移动,左边补上原来的符号位上的数。
以-1为例:
-1的补码为:
1111 1111 1111 1111 1111 1111 1111 1111
进行逻辑移位
0【补位】 1111 1111 1111 1111 1111 1111 1111 111 1【丢弃】
所以移位后:
0111 1111 1111 1111 1111 1111 1111 1111
进行算术移位
1【补位】 1111 1111 1111 1111 1111 1111 1111 111 1【丢弃】
所以移位后:
1111 1111 1111 1111 1111 1111 1111 1111
所以我们在进行移位后,将移位后的补码重新转化为原码,即可得到移位后的值。但是如何转化回原码呢?
我们知道 ,由原码转化为补码时,是通过原码取反再加1,所以转化回去可以先减1再取反,也可以先通过取反加1转化回去。
转化回去之后,我们发现-1算术右移1位的原码和补码相同,所以 移位后的值应该不变,那么到底是不是这样,我们回去验证一下。
int main() {
int a = -1;
int b = 0;
b = a >>1;
printf("%d %d", a, b);
return 0;
}
三、位操作符位操作符有:
& // 按位与 | // 按位或 ^ // 按位异或 注:他们的操作数必须是整数。
位操作符与移位操作符相同,都是对二进制位进行操作,而且操作数都必须是整数。
1.按位与&即就是将两个数的每个二进制位上的数进行判断,如果同时为1时结果为1,其余情况都为0。
如:3和-5在内存中存储的补码为:
0000 0000 0000 0000 0000 0000 0000 0011
1111 1111 1111 1111 1111 1111 1111 1011
n=3&-5的值应该为0000 0000 0000 0000 0000 0000 0000 0011
结果为3,那么我们用代码测试一下。
int main() {
int a = 3;
int b = -5;
int c = a & b;
printf("%d %d\n", a, b);
printf("%d", c);
return 0;
}
通过代码来验证是正确的。
2、按位或 |即就是将两个数的每个二进制位上的数进行判断,如果同时为0时结果为0,其余情况都为1。
以3和-5来举例:
如:3和-5在内存中存储的补码为:
0000 0000 0000 0000 0000 0000 0000 0011
1111 1111 1111 1111 1111 1111 1111 1011
所以n= 3 | -5 = 1111 1111 1111 1111 1111 1111 1111 1011,通过取反加1得到原码,转化为十进制为-5,我们也来通过代码验证一下。
int main() {
int a = 3;
int b = -5;
int c = a | b;
printf("%d %d\n", a, b);
printf("%d", c);
return 0;
}
3、异或^ 即就是将两个数的每个二进制位上的数进行判断,如果相同时结果为0,不同时都为1。
以3和-5来举例:
如:3和-5在内存中存储的补码为:
0000 0000 0000 0000 0000 0000 0000 0011
1111 1111 1111 1111 1111 1111 1111 1011
n=3^-5= 1111 1111 1111 1111 1111 1111 1111 1000,转化为原码,转化为十进制后,得到n=-8.
int main() {
int a = 3;
int b = -5;
int c = a ^ b;
printf("%d %d\n", a, b);
printf("%d", c);
return 0;
}
总结:
今天我们讲解了操作符中的算术操作符,位操作符,移位操作符,并且让大家了解到了二进制中的原码补码和反码,让我们对二进制数有了一个更为深入的认识,希望通过今天的学习,大家知道在内存中数据的储存形式以及几个操作符的使用方法。
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
当前标题:【从饮水机到名人堂之c语言】操作符详解(1)-创新互联
本文网址:http://scyanting.com/article/dpjiji.html