Skip to content

Latest commit

 

History

History
251 lines (179 loc) · 5.93 KB

165-188928-减法运算.sy.md

File metadata and controls

251 lines (179 loc) · 5.93 KB
show version enable_checker
step
1.0
true

减法运算

回忆

  • struct包
    • 就是 封包格式
    • 可以把数字 封包到 字节里
      • pack函数 负责 封包
      • unpack函数 负责 解包
  • struct.pack/struct.unpack
    • 是针对 数字 的编解码操作
  • str.encode/str.decode
    • 是针对字符的编解码操作

图片描述

  • 下次玩点什么呢?👊

回顾

  • 我们首先了解了变量
    • 可以变的量
  • 怎么变呢?
    • 可以直接赋值
    • 可以通过键盘输入
    • 可以通过随机算法赋值
    • 也可以通过运算赋值
  • 我们学过的运算就是加法运算
    • 中间的是加法运算符
    • 两边的是加法操作数
  • 加法有两种运算
    • 字符串加法
    • 数字加法
  • 除了加法之外有没有减法呢?

减法

  • 减法和加法很像
  • 中间的是运算符
  • 左右的是操作数

图片描述

  • 只支持数字的减法
  • 不支持字符串的减法
  • 从字节码的方面如何理解呢?

字节码

图片描述

  • python虚拟机有二进制减法的指令

更多形式

图片描述

  • 除了 10 进制之外
  • 还有各种形式的数字
  • 都可以进行减法
  • 回顾一下数制
    • 0x 16 进制
    • 0o 8 进制
    • 0b 2 进制
  • 进制只是表示方法不同
  • 用几根手指头数苹果
  • 不会因为手指多少而改变苹果的数量

等值

图片描述

  • 上面这些数字其实都相等

变量减法

  • 对左右操作数变量进行赋值
  • 内存里在变量名位置有了相应的值
  • 使用 cpu 对于左右两个操作数进行减法运算
  • 得到的值赋给 iResult

图片描述

  • 结果是零

随机数减法

  • 看起来出错了
    • 分析一下

图片描述

  • 随机数减法减出来的结果是 negative
    • 也就是负的
    • 再负那也得存在内存里
      • 也得是 0101 的形式啊
  • 查帮助

尝试

  • help(int.to_bytes)
    • 查询 int 类 to_bytes 函数的帮助手册

图片描述

  • 我们分析一下函数参数

三个参数

  • 第一个是长度
    • 说明要用几个字节
    • 1、2还是4

图片描述

  • 第二个是字节序
    • 要选 big 还是 little
    • big 就是大端字节序
    • little 就是小端字节序

图片描述

  • 第三个参数 signed 是正负符号位
    • 默认是 False
      • 假的
    • 那我给他改成 True
      • 变成有符号

图片描述

  • 我们给python参数
    • python 给我们 具体的字节状态

再试

  • 这里的字节状态指的是数字的一种存储形式
  • 比如 6
    • 字节数1也可以2也可以
    • 符号可以全正也可以有正有负
    • 可以大端字节序也可以小端字节序
    • 都可以
  • 具体怎么存的是int 这个类(class)具体实现的
    • 但我们可以用各种形式表示这个整数
  • 但如果想表示-1
    • 就不能用无符号
    • 只能用有符号

图片描述

  • 看起来确实是可以得到-1 的二进制形式了
  • 这两个字节
  • 怎么表示
    • 什么是负
    • 什么是正
  • 而且这个 to_bytes 每次都要输入"big"或者"little"
    • 有点麻烦啊
  • 有什么简单方法吗?

pack 打包

图片描述

  • 首先引入 struct 这个 module
  • 我们看一下这个函数 pack
  • 把数字打包

图片描述

  • 我们可以看到
    • 这个数字存储
    • 其实用的是 little-endian
    • 不过两个字节毕竟还是多
  • 我可以简化成
    • 1 个字节么?

pack 细节

  • help(struct.pack)

图片描述

  • 更多细节还得看 struct 这个 module

struct

  • help(struct)

图片描述

  • 可以看到 <> 可以区分 大小端字节序

图片描述

  • 还可以看到具体的数据类型

    • h
      • signed short
        • 有符号 2字节
    • b
      • signed char
        • 有符号 1字节
    • B
      • unsigned char
        • 无符号 1字节
  • 不过还不是很明确

    • 可以看到具体哪个有多少字节么?
  • docs.python.org

网页搜索

图片描述

  • python 的类型和 C 是一一对应的
    • 我们看不到具体的类型名
    • 是因为 python 封装得比较好
    • 但内部肯定还是这些东西
  • 有封装(pack)就有解封(unpack)

逆运算

  • 有打包就有拆包

图片描述

  • 就像有加就有减一样
  • 去 struct 查找一下

图片描述

总结

  • 我们这次学习了减法
  • 数字可以用相减
  • 减号是运算符
    • 被减数和减数是操作数
    • 操作数无论是长短(1,2,4,8)
    • 都可以 pack 查看二进制编码情况
    • 也可以 unpack 解回整数形式
  • 减法没有交换律
    • 可能结果是零
    • 也可能是负数
  • 不过负数具体是怎么用二进制表示的呢?🤪
  • 下次再说 👋