Python运算符中的 位运算符左移和右移

1、在写python  Byte左移和右移的时候,突然想到python移动会不会溢出

  • 在Python中,整数的大小没有限制,因此左移和右移操作不会导致溢出。存储在内存中是的字节是可变的;随着定义的数据大小变化在内存占有的字节

  • import sys
    aa=123456789789456123321654987123456789789456123321654987123456789789456123321654987
    bb=0
    #变量占有多少字节
    print(sys.getsizeof(aa))###60
    print(sys.getsizeof(bb))###28
    

 2、对于C语言的左移右移,有定义具体的数据类型;就涉及到位数限制

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

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

 

  • 18
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值