鹏哥C语言67---算术操作符,移位操作符
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
//--------------------------------------------------------------------------------------------------------第五章 操作符
//-------------------------------------------------------------------------------------------1 操作符分类
/*
算术操作符
移位操作符
位操作符
赋值操作符
单目操作符
关系操作符
逻辑操作符
条件操作符
逗号表达式
下标引用、函数调用和结构成员
*/
//-------------------------------------------------------------------------------------------2. 算术操作符
+ - * / %
除法 /
除法的商
整数除法 1/2=0
浮点型除法 1.0/2=0.5
取模操作符 %
除法的余数
% 操作符两端必须为整数
int main()
{
int a = 7 / 2;
int b = 7 % 2;
printf("%d %d", a, b); // 3 1
return 0;
}
//-------------------------------------------------------------------------------------------3. 移位操作符(二进制)
<<左移操作符(左边丢弃,右边补0)
>>右移操作符
移动的是二进制位
移位操作符的操作数只能 是整数
移位操作符的操作数 不能是负数
整数的二进制表示有3种
原码
反码
补码
正的整数的原码、反码、补码相同
负的整数的原码、反码、补码是要计算的
//7
00000000000000000000000000000111- 原码
00000000000000000000000000000111- 反码
00000000000000000000000000000111- 补码
//-7
10000000000000000000000000000111- 原码
11111111111111111111111111111000- 反码(原码的符号位不变,其他位按位取反就是反码)
11111111111111111111111111111001 - 补码(反码+1就是补码)
整数在内存中 存的是补码
//-----------------------------------------------------------------------------左移操作符
int main()
{
int a = 7;
int b = a << 1;
//00000000000000000000000000000111(补码)
//左移操作符(左边丢弃,右边补0)
//移动的是二进制位
//00000000000000000000000000001110(补码)
printf("a=%d\n", a); // 7
printf("b=%d\n", b); //14
// a 不变,b 变了
//所以左移操作符是一个动作,不会改变数值本身
int aa = -7;
int bb = aa << 1;
//11111111111111111111111111111001(补码)
//左移操作符(左边丢弃,右边补0)
//移动的是二进制位
//11111111111111111111111111110010(补码)
//转成源码 先-1,再取反
//10000000000000000000000000001110
printf("aa=%d\n", aa); // -7
printf("bb=%d\n", bb); // -14
return 0;
}
//-------------------------------------------------------------------------------右移操作符
//算术移位(右边丢弃,左边补原符号位)
//逻辑移位(右边丢弃,左边补0)
int main()
{
int a = 7;
int b = a >> 1;
//00000000000000000000000000000111(补码)
//右移操作符
//移动的是二进制位
//00000000000000000000000000000011(补码)//无法看出是算术移位还是逻辑移位
printf("a=%d\n", a); // 7
printf("b=%d\n", b); // 3
// a 不变,b 变了
//所以左移操作符是一个动作,不会改变数值本身
int aa = -7;
int bb = aa >> 1;
//11111111111111111111111111111001(补码)
//右移操作符(VS是算术右移:右边丢弃,左边补原符号位)
//移动的是二进制位
//*1111111111111111111111111111100(补码)*是1
//转成源码 先-1,再取反
//10000000000000000000000000000100
printf("aa=%d\n", aa); // -7
printf("bb=%d\n", bb); // -4
//移位操作符的操作数------只能是-----整数
return 0;
}
原文地址:https://blog.csdn.net/most_wanted_/article/details/142743564
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!