C语言左移&&右移操作符

本文详细介绍了整数在内存中如何以原码、补码、反码的形式存储,并探讨了左移和右移操作符的工作原理。对于正整数,原码、补码和反码相同,而负数则以补码形式存储。左移操作符(<<)将二进制位向左移动,正数和负数的处理方式有所不同。右移操作符(>>)分为算术右移和逻辑右移,主要讨论了算术右移的情况,负数在右移时高位补符号位。
摘要由CSDN通过智能技术生成

目录

一.整数在内存中的存储方式

1.原码,补码,反码

2.注意事项

二.操作符

1.左移操作符

2.右移操作符


先介绍整数在内存中的存储方式

一.整数在内存中的存储方式

  数子的表示方法主要有原码,补码,反码三种,在内存中的存储形式为其补码形式,均以二进制形式表示

1.原码,补码,反码

a.首先是源码:对于整数来说,原码即为其二进制形式,例如:十进制5的原码为101,又因为一个整型在内存中占4个字节,32个比特位,因此数字5在内存中的存储应为00000000000000000000000000000101,十进制数字-5应表示为10000000000000000000000000000101.注意,32比特位首位又称符号位,规定正数首位为0,负数为1.

b.其次是反码:对于正整数来说,补码,源码,反码是相同的。对于负数来说,其在内存中以其源码的补码存放。下面介绍原码-->反码的转换:对于正数,补码原码反码相同;对于负数,可先写出其原码,然后对位取反,符号位不变即可,例如十进制-5原码转换为反码后为11111111111111111111111111111010.

c.最后是补码:同样对于正整数来说,补码,源码,反码是相同的,不在解释。对于负数来说,补码=反码+1,例如,对于数字-5来说,其补码为11111111111111111111111111111011.

2.注意事项

   对于正整数来说,补码,源码,反码是相同的***

二.操作符

1.左移操作符

左移操作符:<<

规则:正数二进制左移1 ,负数补码左移一,符号位不变,右端空位补零

  左移是指将二进制位向左移动一位同时最后空出来的一位补零。下面以实例演示:例如,十进制数字5,二进制为00000000000000000000000000000101,现左移一位,即变成00000000000000000000000000001010,转换成二进制数字应为10;再看负数,例如-5,左移一位后保留符号位不变,右端补零,应为-10;附上代码验证:

正数:#define _CRT_SECURE_NO_WARNINGS 1#pragma warning(disable:6031)#include<stdio.h>int main(){int a = 5;int b = a << 1;//左移一位printf("%d", b);return 0;}负数:#define _CRT_SECURE_NO_WARNINGS 1#pragma warning(disable:6031)#include<stdio.h>int main(){int a = -5;int b = a << 1;//左移一,符号位不变,右端补零printf("%d", b);return 0;}

2.右移操作符

  右移操作符:>>

  分为:算数右移和逻辑右移

  介绍:算数右移,计算机系统以算数右移为主

  规则:右移末尾舍弃,高位补符号位

  仍看例子,例如正整数5,存储2进制为00000000000000000000000000000101,右移一位后变成00000000000000000000000000000010,对应十进制为2。再例如负整数-5,左移后高位补符号位,低位舍弃,-5对应的原码:

10000000000000000000000000000101;反码:111111111111111111111111111111111010

;补码111111111111111111111111111111111011,补码右移1位后变成111111111111111111111111111111111101,对应的反码:111111111111111111111111111111111100,对应的原码:

10000000000000000000000000000011,及二进制-3.下边附上验证代码:

5:#define _CRT_SECURE_NO_WARNINGS 1#pragma warning(disable:6031)#include<stdio.h>int main(){int a = 5;int b = a >> 1;//原码=反码=补码,原码右移一位,舍弃低位,结果为2printf("%d", b);return 0;}-5:#define _CRT_SECURE_NO_WARNINGS 1#pragma warning(disable:6031)#include<stdio.h>int main(){int a = -5;int b = a >> 1;//右移一位,补码符号位不变,舍弃低位,结果为-3printf("%d", b);return 0;}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

whiteInJava

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值