bit64运算在32位系统中的软件模拟方法

随着数据精度需求的提升,即使在32位系统中也常需处理64位整数。本文系统性地研究在32位架构下如何通过软件模拟实现64位数据的加法、减法、乘法、除法以及按位逻辑运算,确保计算结果的正确性与性能的可接受性。

一、概述

目前的LuatOS固件有32位和64位两类;

本核心库bit64描述的是:32位系统固件上对64位数据的基本算术运算和逻辑运算;

如果你的项目一定要使用32位内核固件,并且用到了64位数据操作,可以阅读参考本核心库描述的内容;

如果你的项目使用64位内核固件,则可以按照正常的思路,对64位数据运算即可,不用阅读参考本核心库描述的内容;

32位内核固件和64位内核固件的唯一区别是是否支持64位数据的直接运算,其余功能完全相同,根据自己的项目需求来决定选择何种内核固件;

32 位数据:可以表示的数值范围较小(4 字节),对于整数数据类型,范围是 (-2^{31}) 到 (2^{31}-1)(有符号整数)或 (0) 到 (2^{32}-1)也就是(无符号整数)。

64 位数据:有更大的表示范围(8 字节),整数类型可以表示 (-2^{63}) 到 (2^{63}-1)(有符号整数)或 (0) 到 (2^{64}-1)(无符号整数)。

总结对比
image

处理更大的数据位宽通常会增加功耗,因为需要更大的数据总线和更复杂的运算电路。对于一些低功耗的嵌入式系统,选择 32 位数据会有助于降低功耗。

9字节数据:本文的64bit数据为:小端格式的9字节数据的字符串,最后一个字节是类型(0是整数,1是浮点), 前面8个字节是数据。

下面来说明将十进制数字 123456 用 64 位小端字节序 数据怎么表示?

要将十进制数字 123456 表示为 64 位小端字节序 数据,需遵循小端序 “低位字节在前,高位字节在后” 的存储规则。以下是具体步骤和结果:

核心原理
64 位带符号整数:123456 是正数,补码形式为符号位(0)+ 63 位数值位(高位补 0)

小端字节序:数值的低位字节存储在内存低地址,高位字节存储在高地址(与人类读写习惯相反)

转换步骤
十进制转十六进制:123456 对应的十六进制为 0x000000000001E240(共 16 位,8 字节)。按字节拆分(每 2 位十六进制为 1 字节):00 00 00 00 00 01 E2 40(从高位到低位排列)

按小端序反转字节顺序:小端序要求 “低位字节在前”,因此反转上述字节顺序:40 E2 01 00 00 00 00 00

最终表示形式

image

示例
image

二、核心示例

1、核心示例是指:使用本库文件提供的核心API,开发的基础业务逻辑的演示代码;

2、核心示例的作用是:帮助开发者快速理解如何使用本库,所以核心示例的逻辑都比较简单;

3、更加完整和详细的demo,请参考 LuatOS仓库 中各个产品目录下的demo/bit64
image

三、常量详解

核心库常量,顾名思义是由 LuatOS 内核固件中定义的、不可重新赋值或修改的固定值,在脚本代码中不需要声明,可直接调用;

每个常量对应的常量取值仅做日志打印时查询使用,不要将这个常量取值用做具体的业务逻辑判断,因为LuatOS内核固件可能会变更每个常量对应的常量取值;

如果用做具体的业务逻辑判断,一旦常量取值发生改变,业务逻辑就会出错;

bit64核心库没有常量。

四、函数详解

4.1 bit64.to32(data64bit)

功能

64bit的string类型的数据转成32bit的number类型的数据

参数

data64bit
image

返回值

local b32 = bit64.to32(data64bit)

b32
image

示例
image

4.2 bit64.to64(data32bit)

功能

32bit的number类型的数据转成64bit的string类型的数据

参数

data32bit
image

返回值

local b64 = bit64.to64(data32bit)

b64
image

示例
image

4.3 bit64.show(a,type,flag)

功能

64bit数据格式化打印成字符串,用于显示值

参数

a
image

type
image

flag
image

返回值

local showdate = bit64.show(a,type,flag)

showdate
image

示例
image

4.4 bit64.plus(a,b,flag1,flag2)

功能

64bit数据加,a+b,a和b中有一个为浮点,则按照浮点运算

参数

a
image

参数

b
image

参数

flag1
image

参数

flag2
image

返回值

local c = bit64.plus(a,b,flag1,flag2)

c
image

示例
image

4.5 bit64.minus(a,b,flag1,flag2)

功能

64bit数据减,a-b,a和b中有一个为浮点,则按照浮点运算

参数

a
image

b
image

flag1
image

flag2
image

返回值

local c = bit64.minus(a,b,flag1,flag2)

c
image

示例
image

4.6 bit64.multi(a,b,flag1,flag2)

功能

64bit数据乘,a*b,a和b中有一个为浮点,则按照浮点运算

a
image

b
image

flag1

image

flag2
image

返回值

local c = bit64.multi(a,b,flag1,flag2)

c
image

示例
image

4.7 bit64.pide(a,b,flag1,flag2)

功能

64bit数据除,a/b,a和b中有一个为浮点,则按照浮点运算

a
image

b
image

flag1
image

flag2
image

返回值

local c = bit64.pide(a,b,flag1,flag2)

c
image

示例
image

4.8 bit64.shift(a,b,flag)

功能

64bit数据位移 a>>b 或者 a<<b

a
image

b

image

flag
image

返回值

local c = bit64.shift(a,b,flag)

c
image

示例
image

4.9 bit64.strtoll(data, base)

功能

将字符串转为LongLong数据

参数

data
image

base
image

返回值

local data = bit64.strtoll(data, base)

data
image

示例
image

五、模组支持说明

支持LuatOS开发的所有模组都支持bit64核心库。

今天的内容就分享到这里了~

posted @ 2026-02-09 17:09  合宙LuatOS  阅读(8)  评论(0)    收藏  举报