当前位置: 首页 > java >正文

两种常见的C语言实现64位无符号整数乘以64位无符号整数的实现方法

以下是两种常见的C语言实现64位无符号整数乘以64位无符号整数的实现方法,分别给出可移植版本和现代编译器优化版本:

方法1:可移植版本(通用标准C)


#include <stdint.h>typedef struct {uint64_t lo; // 低64位uint64_t hi; // 高64位
} uint128_t;uint128_t mul64x64(uint64_t a, uint64_t b)
{// 将64位数拆分为高低各32位const uint64_t a_lo = (uint64_t)(uint32_t)a;const uint64_t a_hi = a >> 32;const uint64_t b_lo = (uint64_t)(uint32_t)b;const uint64_t b_hi = b >> 32;// 计算部分积const uint64_t p0 = a_lo * b_lo;const uint64_t p1 = a_lo * b_hi;const uint64_t p2 = a_hi * b_lo;const uint64_t p3 = a_hi * b_hi;// 计算中间结果const uint64_t mid = p1 + (p0 >> 32);const uint64_t carry = (mid < p1) ? 1 : 0; // 处理溢出进位const uint64_t mid2 = p2 + (mid & 0xFFFFFFFFULL);const uint64_t carry2 = (mid2 < p2) ? 1 : 0; // 处理溢出进位// 组装最终结果return (uint128_t){.lo = (mid2 << 32) | (p0 & 0xFFFFFFFFULL),.hi = p3 + (mid >> 32) + (mid2 >> 32) + carry + carry2};
}在这里插入代码片

方法2:编译器优化版本(GCC/Clang)

#include <stdint.h>typedef unsigned __int128 uint128_t; // GCC/Clang扩展类型uint128_t mul64x64(uint64_t a, uint64_t b)
{return (uint128_t)a * (uint128_t)b; // 直接使用内置128位类型
}

两种方案的对比:
特性 通用标准C版本 编译器优化版本
可移植性 符合C99标准,任何编译器可用 仅限GCC/Clang等支持编译器
性能 需要手动处理进位,效率较低 编译器生成最优汇编
代码复杂度 需要显式处理所有进位逻辑 单行代码实现
最大输入 0xFFFFFFFFFFFFFFFF * 0xFFFFFFFFFFFFFFFF 同上
输出精度 完整128位结果 同上
使用示例:

#include <stdio.h>int main()
{// 测试用例:0xFFFFFFFFFFFFFFFF * 0xFFFFFFFFFFFFFFFFconst uint64_t a = 0xFFFFFFFFFFFFFFFF;const uint64_t b = 0xFFFFFFFFFFFFFFFF;// 方法1使用uint128_t result1 = mul64x64(a, b);printf("通用版结果: 0x%016lX%016lX\n", result1.hi, result1.lo);printf("通用版结果: 0x%016llX%016llX\n", result1.hi, result1.lo);// 方法2使用uint128_t result2 = (uint128_t)a * b;printf("优化版结果: 0x%016lX%016lX\n", (uint64_t)(result2 >> 64), (uint64_t)result2);return 0;
}

输出结果:

通用版结果: 0xFFFFFFFFFFFFFFFE0000000000000001
优化版结果: 0xFFFFFFFFFFFFFFFE0000000000000001

建议根据实际需求选择:

如果需要最佳性能且使用支持__int128的编译器,选择方法2
如果需要最大可移植性,选择方法1
如果要处理有符号数,需要额外处理符号位(可用类似方法扩展)

http://www.xdnf.cn/news/5973.html

相关文章:

  • 【嵌入式】记一次解决VScode+PlatformIO安装卡死的经历
  • Apifox使用方法
  • Xianyu AutoAgent,AI闲鱼客服机器人
  • 无人机信号监测系统技术解析
  • codeforcesE. Anna and the Valentine‘s Day Gift
  • 在 STM32 上使用 register 关键字
  • 部署大模型:解决ollama.service: Failed with result ‘exit-code‘的问题
  • ROS多机集群组网通信(四)——Ubuntu 20.04图形化配置 Ad-Hoc组网通信指南
  • element-plus自动导入插件
  • 使用DevEco Studio性能分析工具高效解决鸿蒙原生应用内存问题
  • python的命令库Envoy
  • 【树莓派4B】对树莓派4B进行换源
  • 关于索引的使用
  • Fiori学习专题四十一:表单控件
  • js中的同步方法及异步方法
  • [中国版 Cursor ]?!CodeBuddy快捷搭建个人展示页面指南
  • 20250513_问题:由于全局Pytorch导致的错误
  • 【Nacos】env NACOS_AUTH_TOKEN must be set with Base64 String.
  • TCP协议详细讲解及C++代码实例
  • 【算法笔记】ACM数论基础模板
  • ContextAnnotationAutowireCandidateResolver的作用
  • 5月13日复盘
  • PAC文件:智能代理配置的瑞士军刀
  • rtty操作记录说明
  • 保险销售系统对接保险公司接口的常见技术架构
  • 阿里二面:聊聊 MySQL 主从同步方案的优缺点
  • 【兽医电子处方软件】佳易王宠物医院电子处方管理系统:宠物医院诊所用什么软件?一键导入配方模板软件程序实操教程 #操作简单 #宠物医院软件下载安装
  • C语言中的宏
  • 数控滑台:革新传统加工方式的利器
  • 谁在守护我们的危险时刻