python & 0xFFFFFFFF打印输出负数的补码[通俗易懂]

python & 0xFFFFFFFF打印输出负数的补码[通俗易懂]-7的有符号原码和补码表示-7的原码:0b10000111(8位)-7的补码:0b11111001(8位)python中的输出a=-7print(bin(a))#输出-0b111python直观地打印输出了带负号的原码显示为了能够打印输出对应的补码表示进行如下运算:a=-7b=a&0xFF#-7的补码print(b)#249print(0b11111001)print(bin(b)#输出249//249原码0

大家好,又见面了,我是你们的朋友全栈君。

-7的有符号原码和补码表示

  • -7的原码:0b1000 0111 (8位)
  • -7的补码:0b1111 1001 (8位)

python中的输出

a = -7
print(bin(a))

# 输出
-0b111

python直观地打印输出了带负号的原码显示
为了能够打印输出对应的补码表示进行如下运算:

a = -7
b = a & 0xFF  # -7的补码
print(b)  # 249
print(0b11111001) 
print(bin(b)

# 输出
249  // 249原码0b11111001
249
0b11111001

也就是说与0xFF相与后得到是249的原码表示,不过刚好与-7的补码形式相同
注:0xFF是8位,相与得到的结果为8位;0xFFFFFFFF是32位,相与得到的结果则为32位。
总结:

  1. python内部运算都是补码进行的,如要得到-7的补码打印输出,就要与0xFF相与,就是-7的补码形式各位上都和1与运算,1仍为1,0相与后则为0,得出的结果就是-7的补码。但在后面第2条的“以人为方便”的逻辑下,python将得到-7的补码结果作为原码表示得到了另一个数249准确地说,经过和0xFF与运算后得到了一个新的数249(与0xFF…相与必定为非负数),刚好它的原码表示与-7的补码相同;
  2. 在程序编写过程中,无论是打印整形数值的二进制表示和用二进制表示的数输入如“print(0b11111001)”都是这样的逻辑:都以人为方便的方式为出发点,就二进制数值而言输入和输出都为无符号原码(非负数)表示为默认逻辑,若要输出负数,人只要前面加负号,如print(-0b11111001),结果为-249;
  3. 我的理解:与0xFF相与,编写的0xFF默认也是无符号原码,运算时0xFF原码与补码相同,以补码运算后得到的结果补码为正数的补码,原码补码相同,输出补码转换后的原码是跟补码一样的,如下-0xFF的情况:(0xFF一样,感觉最终的结果的正负跟着0xFF走)
a = -7
b = a & -0xFF
print(bin(b))

# 输出
-0b11111111

# 过程
-7 的补码: 1111 1001 (8位)
-0xFF的补码:1000 0001 (8位)
1, 1 1 1 1 0 0 1
1, 0 0 0 0 0 0 0   &
————————————————
1, 0 0 0 0 0 0 0   ---结果补码形式
输出以无符号原码输出
补码转原码,符号位不变,负数则数值取反加一,这里取反加一有进位所以最终的表示为
1,1 1 1 1 1 1 1 1
python bin()输出后则就是结果输出
-0b11111111

如何将得到-7和0xFF相与后的补码正确打印补码对应的十进制输出而不是作为249的原码打印十进制输出

采用取反符号~

a = -7
b = a & 0xFF
print(~b ^ 0xFF)

# 输出
-7

相当于”取反加一“(原码与补码数值位的转换口诀,详见计算机组成原理),再添加负号。过程就是先得到的符合“以人为方便”的逻辑下无符号原码表示0b111,再添加负号得到-0b111,打印得到-7。若a为正整数7最后得到的则是带负号的-7补码”-0b11111001″。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/145549.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • leetcode二叉树的层次遍历_完全二叉树的中序序列

    leetcode二叉树的层次遍历_完全二叉树的中序序列LeetCode二叉树中序遍历1.1题目描述给定一个二叉树的根节点root,返回它的中序遍历。1.2示例示例:输入:root=[1,null,2,3]输出:[1,3,2]2.1解题2.1.1解题方法:递归二叉树的中序遍历方法:按照“左(子树)→中→右”顺序遍,可以使用递归方式进行遍历Java版解题/***Definitionforabinarytreenode.*publicclassTreeNode{*intval

    2022年9月14日
  • 轻松学习RSA加密算法原理「建议收藏」

    轻松学习RSA加密算法原理「建议收藏」http://blog.csdn.net/q376420785/article/details/8557266http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html以前也接触过RSA加密算法,感觉这个东西太神秘了,是数学家的事,和我无关。但是,看了很多关于RSA加密算法原理的资料之后,我发现其

    2022年5月1日
  • 动态规划之背包问题——01背包

    动态规划之背包问题——01背包文章目录一、01背包问题二、二维dp数组解决01背包问题1.确定dp数组以及下标的含义2.确定递推公式3.dp数组初始化4.确定遍历顺序5.举例推导dp数组三、一维dp数组解决01背包问题1.确定dp数组以及下标的含义2.一维dp数组的递推公式3.一维dp数组如何初始化4.一维dp数组遍历顺序5.举例推导dp数组四、leetcode例题讲解01背包问题416.分割等和子集1049.最后一块石头的重量II494.目标和474.一和零背包问题中我们常见的就是01背包和完全背包。在l

    2022年7月26日
  • sqlSessionFactory异常

    sqlSessionFactory异常org.springframework.beans.factory.BeanCreationException:Errorcreatingbeanwithname‘sqlSessionFactory’definedinclasspathresource[spring/applicationContext.xml]:Invocationofinitmethodfai…

    2022年4月29日
  • 微商分销代理商城源码-代理等级和升级条件

    微商分销代理商城源码-代理等级和升级条件介绍:微商分销代理商城源码基于think框架开发是一款微商分销代理商城源码,可以自己设置代理等级和升级条件(如购买指定商品、消费额度)网站搭建方式介绍:测试环境php7.0+mysql5.6数据库配置文件\application\database.php后台/admin用户:admin密码:123456网盘下载地址:http://kekewl.cc/jpaQnrd7VcZ0图片:网站源码首页截图演示网站后台截图演示…

    2022年5月13日
  • Eclipse中取消生成TODO Auto-generated method stub

    Eclipse中取消生成TODO Auto-generated method stub

    2021年7月18日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号