MicroPython 是一种适用于微控制器和其他受限环境的 Python 编程语言的实现。它旨在提供与 Python 3 语言的紧密兼容,同时考虑到内存和计算资源的限制。MicroPython 库是这门语言的核心组成部分,提供了一系列的模块和函数,使得开发者能够在硬件上执行各种任务。
下面将通过系列文章,逐一解读microPython,以便让读者了解掌握microPython的整个核心逻辑.,以便读者可以透过这个Python的最小内核,掌握Python解析器的核心实现逻辑,学习世界上最优秀的源码设计之一.
microPython Python最小内核源码解析
NI-motion运动控制c语言示例代码解析
python编程示例系列 python编程示例系列二
python的Web神器Streamlit
代码是 C 语言编写的,用于处理 mp_int_t 类型的整数运算。代码中包含了三个函数:
-
mp_small_int_mul_overflow
:判断两个整数相乘是否会溢出。这个函数通过比较两个操作数与它们能够容纳的最大或最小值的倒数来判断是否会发生溢出。 -
mp_small_int_modulo
:计算两个整数的模运算结果。这个函数首先使用%
运算符计算模的结果,然后根据 Python 规范要求调整结果的符号,使其与第二个操作数的符号相同。 -
mp_small_int_floor_divide
:计算两个整数的向下取整除法结果。这个函数根据操作数的正负性对分子进行调整,然后执行除法运算,得到向下取整的结果。
这些函数在处理整数运算时非常有用,尤其是在需要精确控制运算结果的金融、科学计算等领域。通过这些函数,可以避免溢出错误,确保计算结果的正确性。
#include "py/smallint.h"
// 判断两个mp_int_t类型的数相乘是否会溢出
bool mp_small_int_mul_overflow(mp_int_t x, mp_int_t y) {
// 根据 CERT INT32-C 标准检查乘法溢出
if (x > 0) {
// x 是正数
if (y > 0) {
// x 和 y 都是正数
// 如果 x 大于 y 能够容纳的最大值,则会溢出
if (x > (MP_SMALL_INT_MAX / y)) {
return true;
}
} else {
// x 是正数,y 非正数
// 如果 y 小于 x 能够容纳的最小值的倒数,则会溢出
if (y < (MP_SMALL_INT_MIN / x)) {
return true;
}
} // x 是正数,y 非正数
} else {
// x 非正数
if (y > 0) {
// x 非正数,y 是正数
// 如果 x 小于 y 能够容纳的最小值的倒数,则会溢出
if (x < (MP_SMALL_INT_MIN / y)) {
return true;
}
} else {
// x 和 y 都是非正数
// 如果 x 不是 0 且 y 小于 x 能够容纳的最大值的倒数,则会溢出
if (x != 0 && y < (MP_SMALL_INT_MAX / x)) {
return true;
}
} // 结束如果 x 和 y 都是非正数
} // 结束如果 x 非正数
return false;
}
// 计算两个 mp_int_t 类型的数的模运算结果
mp_int_t mp_small_int_modulo(mp_int_t dividend, mp_int_t divisor) {
// Python 规范要求模运算的结果与第二个操作数符号相同
dividend %= divisor;
// 如果结果与第二个操作数符号不同,则进行调整
if ((dividend < 0 && divisor > 0) || (dividend > 0 && divisor < 0)) {
dividend += divisor;
}
return dividend;
}
// 计算两个 mp_int_t 类型的数的向下取整除法结果
mp_int_t mp_small_int_floor_divide(mp_int_t num, mp_int_t denom) {
// 如果 num 是正数
if (num >= 0) {
// 如果 denom 是负数,则对 num 进行调整
if (denom < 0) {
num += -denom - 1;
}
} else {
// 如果 num 是负数
// 如果 denom 是正数,则对 num 进行调整
if (denom >= 0