鹏哥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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值