python之将byte转换为int类型函数int.from_bytes详解与原码反
码补码。。。
函数格式: int.from_bytes(bytes, byteorder, *, signed=False)
简单demo:
s1 = b'\xf1\xff'
print(int.from_bytes(s1, byteorder='big', signed=False))
print(int.from_bytes(s1, byteorder='little', signed=True))
输出:61951
-15
参数解释: bytes是要转换的⼗六进制;
byteorder:选'big'和'little',以上例为例,其中big代表正常顺序,即f1ff。little反之,代表反序fff1;
signed:选True、Flase表⽰是否要区分⼆进制的正负数含义。即是否要对原⼆进制数进⾏原码反码补码操作。
在分析demo的转换原理前我们⾸先要知道原码、补码、反码的知识:
原码:为了表⽰负数.(改变开头位数字表⽰正负,1为负,0为正)
我们都知道1的⼆进制数为0001,那-1呢?为了表⽰负数,规定了如果开头那个数字如果是1就代表负数,即-1的⼆进制
数原码为1001
反码:为了处理负数.(将负数的原码除了开头位全部由0变1或者由1变0)
我们都知道1+(-1)=0,但是⼆者的⼆进制数 0001+1001=1010,结果是-2,这不是我们想要的,所以出现了反码
反码,顾名思义就是“反着来”,把0变成1,1变成0,反的是负数的原码,即-1的反码 1001 变成了1110。
这时候1+(-1)-> 0001 +1110=1111,再将结果1111从反码返回成原码即1000(-0),就是我们希望得到的数0.
注意:负数原码最开头表⽰数字正负的那个数字位 ”1“ 不需要进⾏反码操作。
补码:为了处理-0与+0同时存在问题. (对反码进⾏+1操作,如果最⾼位/开头位被”溢出“,则舍去)
-0的原码是1000,反码是1111,如果+1,则它的补码是10000,如果这是四位字长的⼆进制存放位,就要把1舍去,即-0的补码变 成了0000,这是我们希望的不分正负的0的表⽰⽅式,解决了+0\-0同时存在问题。
相应的,当3+(-3)的时候,有 0011 + 1101(1100的补码) =10000,舍去最⾼为1,即结果为0000,是我们希望的
demo分析:f1转换成⼆进制是1111 0001 ,ff 则为1111 1111
(1) 在第⼀⾏print中,我们参数选择的是big正序,false不分正负符号,即:
直接转换正序 f1ff ⼆进制:1111 0001 1111 1111 转换为⼗进制:61951
(2)在第⼆⾏print中,我们参数选择的是little反序,true代表区分正负符号,即:
⾸先转换 f1ff 为反序 fff1 ,反序的⼆进制有:1111 1111 1111 0001
由于我们选择了true,所以要区分⼆进制的正负数含义:
python货币转换原码1111 1111 1111 0001最⾼位(开头位)是1,即此⼆进制数为负数。
再进⾏反码操作,即有 1000 0000 0000 1110
再进⾏补码操作,有1000 0000 0000 1111
由于最⾼位1(开头位)不进⾏⼆进制转换计算,所以我们将除了最⾼位1(表⽰负数)以外
数字进⾏⼆进制转换⼗进制操作,即000 0000 0000 1111的⼗进制为15,即最后结果为-15.
参考资料:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论