C语言 32位 和 64位数 之间 位数 的加减乘除运算

在32位机器上实现64位数的除法 在32位机器上不能直接进行64位数据的除法,比如a或b是64位的数据的时候,要计算a/b,不能直接data=a/b;这样的计算,编译器会报错,缺少相关的指令。这就需要我们单独去实现64位数据的除法函数。在32位机器上实现64位数据除法的方式有很多,主体思想就是分解成32位的数据去进行除法或者进行移位计算,一个数往右移一位等于该数除以2,往右移两位等于该数除以4,也就是移位n次等于除去2^(n-1)。... 阅读详情
#ifndef __INC_PUBLHEAD_H__
    #define __INC_PUBLHEAD_H__
//-----------------------------------------------------------------------------
#include <stdio.h>
#include "PublType.h"
//-----------------------------------------------------------------------------
#endif

#ifndef __INC_PUBLTYPE_H__
    #define __INC_PUBLTYPE_H__
//-----------------------------------------------------------------------------
typedef char                String;         // 字符串型
typedef unsigned int        Boolean;        // 布尔型

typedef unsigned char       UFix08;         // 无符号  8 位
typedef unsigned short int  UFix16;         // 无符号 16 位
typedef unsigned long int   UFix32;         // 无符号 32 位

typedef signed char         SFix08;         // 带符号  8 位
typedef signed short int    SFix16;         // 带符号 16 位
typedef signed long int     SFix32;         // 带符号 32 位

typedef unsigned int        UAuto08;        // 无符号 至少  8 位
typedef unsigned int        UAuto16;        // 无符号 至少 16 位
typedef unsigned long       UAuto32;        // 无符号 至少 32 位

typedef signed char         SAuto08;        // 带符号 至少  8 位
typedef signed int          SAuto16;        // 带符号 至少 16 位
typedef signed long         SAuto32;        // 带符号 至少 32 位
//-----------------------------------------------------------------------------
#endif


#include "PublHead.h"

#include "PublHead.h"

typedef struct
{
    UFix32   high;
    UFix32   low;
} STR_UFix64;

// 函数功能:    *retv = a + b;
// 输入:  a , b
// 输出:  *retv
static void Cal_U32_Add_U32(UFix32 a, UFix32 b, STR_UFix64 *retv)
{
	retv->low = a + b;
	retv->high = (retv->low < a) ? 1 : 0;
}

// 函数功能:  *a += *b;
// 输入:  *a , *b
// 输出:  *a
static void Cal_U64_Add_U64(STR_UFix64 *a, STR_UFix64 const *b)
{
#if 1
	UFix32 t;

	t = a->high;
	Cal_U32_Add_U32(a->low, b->low, a);
	a->high += (t + b->high);
#elif 0
	STR_UFix64 low = {0};

	Cal_U32_Add_U32(a->low, b->low, &low);
	a->high = a->high + b->high + low.high;
	a->low = low.low;
#else
	UFix32 low_temp = a->low;
	a->low += b->low;
	if (a->low < low_temp || a->low < b->low) {
		a->high = a->high + b->high + 1;
	} else {
		a->high += b->high;
	}
#endif

}

// 函数功能:  *retv = a * b
//                = (aH * 0x10000 + aL) * (bH * 0x10000 + bL)
//                = ((aH * bH * 0x100000000) + (aL * bL)) + (aH * bL + aL * bH) * 0x10000
// 输入:  a , b
// 输出:  *retv
static void Cal_U32_Mul_U32(UFix32 a, UFix32 b, STR_UFix64 *retv)
{

#if 1
	UFix32 aH, bH;
	STR_UFix64 mid;

	aH = a >> 16;
	a &= 0x0000ffff;
	bH = b >> 16;
	b &= 0x0000ffff;
	retv->high = aH * bH;
	retv->low = a * b;
	Cal_U32_Add_U32(aH * b, a * bH, &mid);

	mid.high = (mid.high << 16) + (mid.low >> 16);
	mid.low = mid.low << 16;
	Cal_U64_Add_U64(retv, &mid);


#else
	UFix32 i = 0;
	UFix32 big_number = 0;
	UFix32 small_number = 0;

//	big_number = a > b ? a:b;
//	small_number = a < b ? a:b;
//	retv->low = 0;
//	retv->high = 0;
//
//
//	for (i = 0; i < small_number; i++) {
//		retv->low += big_number;
//		if (retv->low < big_number) {
//			retv->high += 1;
//		}
//	}


#endif

}

// 函数功能:  *a /= b
//				= (aH + aL) / b
// 输入:  *a , b
// 输出:  *a
static void Cal_U64_Div_U16(STR_UFix64 *a, UFix16 b)
{
#if 1
	UFix32 H, L;

	H = a->high;
	L = a->low;
	a->high = H / b;
	H = ((H % b) << 16) | (L >> 16);
	a->low = (H / b) << 16;
	H = ((H % b) << 16) | (L & 0xffff);
	a->low |= (H / b);
#else
	UAuto32 j = 0;
	UFix32 remainder = 0;
	UFix32 temp = 0;

	remainder = a->high % b;
	a->high /= b;

	temp = (remainder << 16) + (a->low >> 16);
	remainder = temp % b;
	j = temp / b;
	a->low = (j << 16) | (((a->low & 0x0000ffff) + (remainder << 16)) / b) ;
#endif

}


C语言base64算法简单实现 用过一段大家常用的base64代码,老是多一位少一位弄不清楚,一狠心自己动手重写了一遍, 写完查找了其他网友实现的代码,才发现其实精品很多,既然写了就分享给可以用的上的朋友, 写代码就要写大家都能看的懂的代码,VC,GCC 编译没有问题 其中 buf_base64 是把一般buf 转为base64码,base64_buf 是把base64码转回去 unsigned char g_b 阅读详情

相关推荐

C语言第一课 C语言基础

接下来不分顺序的给大家讲一下Keil5中常用到的一些语句。

2401_83843432的博客 1653

【位操作笔记】位计数算法 使用64位指令计算32位数

位计数算法 使用64位指令计算32位数位计数算法说明位计数代码位计数代码算法来源算法计算过程[参考资料] 位计数 位计数(Counting bits set),指的是计算一个数里bit位置1的个数,例如一个8位数0xea = 0b1110 1010,位置1的个数为5。 算法说明 该算法用于计算32位的数。这个算法需要在支持快速模除的64位CPU上才能达到高性能的效果。计算32位数的位置1的个数,只需要15次操作。 位计数代码 位计数代码 unsigned int count_32bit(unsigned i

1183

C语言编程常用知识点概论——第一章基本数据类型、运算符

2021年10月19日 注意:本系列知识点汇总以河南省指定教材《C语言程序设计(第二版)》章节目录为发布顺序

qq_60474391的博客 2341

041.64bit除法运算

Title 32-bit Division Example (Divide32.asm) ; This program divides a 64-bit integer dividend ; by a 32-bit divisor. The quotient and remainder ; are each 32 bits. INCLUDE Irvine32.inc .data dividend QWORD 0000000800300020h divisor DWOR

dosdiosas_的博客 403

STM32嵌入式RSA非对称加密实现:从64位原理到安全应用实践

非对称加密是现代信息安全体系的基石,其核心原理基于大数分解等数学难题,通过公钥与私钥的配对实现加密与身份认证。相较于对称加密,非对称加密解决了密钥分发与管理的根本性难题,在数字签名、密钥协商等场景中具有不可替代的技术价值。在嵌入式系统,特别是STM32这类资源受限的微控制器(MCU)中,实现非对称加密面临计算性能与内存占用的严峻挑战。本文聚焦于RSA算法在STM32平台的移植与优化,通过剖析64位密钥的实现方案,深入探讨大数运算、快速模幂算法等核心原理,并评估其对系统实时性的影响。文章结合固件升级认证、物联

afeyfre41671的博客 373

怎样学习C语言——快速上手C语言系列之—什么是指针

还不会C语言吗?C语言系列它来了!!! 怎样学习C语言——快速上手C语言系列之—认识C语言指针

qq_44687460的博客 1414

C语言中常用运算符

C语言中常用运算符 C语言中常用到的运算符主要有算数运算符、逻辑运算符、位运算发、关系运算符和其它的。 一、算数运算符 主要是我们在数学运算中使用的一些加减乘除运算符,但是有几个运算符与我们数学中的不 太一样(以下会说明),主要有: (1)+ 加法 (2)- 减法 (3)* 乘法 (4)/ 除法---->只会得到...

Ye小子 2590

64位乘除法

64位乘除法适合于32位嵌入式平台的开发 位乘除算法功能: 给定两组数,分别为10元素无符号整型数组,计算出分子数组(前n_size个,n_size为0~10之间)之积与分母数组(前d_size个,d_size为0~10之间)之积,再将分子之积除以分母之积,得出四舍五入的整型商。 如果分子或分母之积溢出,则需进行低精确除,即将对应位置的分子和分母相除,最后将这些结果相乘得出最终商,注意此时是不会对每对分子分母的除法进行结果补偿(即对商进行四舍五入)的。 若计算中输入不合法或者计算结果溢出,则计算失败。

c语言 怎么访问64位地址_巧言C语言指针 | 纯干货讲解

指针对于C来说太重要!然而,想要全面理解指针,除了要对C语言有熟练的掌握外,还要有计算机硬件以及操作系统等方方面面的基本知识,所以本文尽可能的通过一篇文章完全讲解指针。为什么需要指针?指针解决了一些编程中基本的问题。第一,指针的使用使得不同区域的代码可以轻易的共享内存数据。当然小伙伴们也可以通过数据的复制达到相同的效果,但是这样往往效率不太好。因为诸如结构体等大型数据,占用的字节数多,复...

weixin_29017445的博客 2040

保姆级教程:用Wireshark抓包分析10M汽车以太网PLCA轮询机制(附pcap文件)

本文详细介绍了10M汽车以太网PLCA轮询机制的抓包分析与性能优化方法。通过Wireshark实战教程,解析PLCA协议的时分多址特性、总线型拓扑结构及带宽优化策略,帮助工程师提升车内网络的可靠性和实时性。附赠pcap文件供实践参考。

wdx01234567的博客 239

FPGA实现Gardner环定时同步:Verilog代码与Testbench实战解析

本文深入解析了在FPGA上实现Gardner环定时同步的完整过程,详细阐述了其非数据辅助的定时误差检测原理。通过Verilog代码实战,展示了内插滤波器、定时误差检测器、环路滤波器和数控振荡器等核心模块的设计,并提供了完整的Testbench验证方法,帮助开发者解决数字通信系统中的时钟同步难题。

gpt4scribbler的博客 576

使用位运算实现int32位 整数的加减乘除

我觉得比较难想的是加法吧。 首先加法,脑海中脑补二进制加法,相同位相加,超过2 ,则进1,留0 那么用位运算怎么实现呢?其实理解了异或和与操作,就很容易想出来了。 我觉得异或操作和与操作完全就是实现加法的。 异或就是相同位相加最后留下的结果,而与就是相同位相加是否进1的结果。 异或:相同位 相同为0,不同为1。 与:相同位 都是1结果才是1,否则都是0。 这不就是二进制相加吗? 异或 与...

weixin_30394669的博客 739

手把手教你用Xilinx SelectIO IP核搞定ADS42LB69高速ADC的DDR数据采集(附仿真调试技巧)

本文详细介绍了如何使用Xilinx SelectIO IP核实现ADS42LB69高速ADC的DDR数据采集,包括IP核配置、仿真验证和硬件调试技巧。通过精准的时序控制和实战调试方法,解决高速数据采集中的时序对齐问题,提升系统稳定性和可靠性。特别适合FPGA工程师和高速ADC接口设计者参考。

weixin_42533622的博客 153

C语言指针,这可能是史上最干最全的讲解啦(附代码)!!!

点击上方“大鱼机器人”,选择“置顶/星标公众号”福利干货,第一时间送达!指针对于C来说太重要。然而,想要全面理解指针,除了要对C语言有熟练的掌握外,还要有计算机硬件以及操作系统等方方面面...

张巧龙的博客 8814

HBuilderX结合Android Studio实现Uniapp安卓Apk高效离线打包指南

本文提供了一份详细的Uniapp安卓Apk离线打包实战指南。通过整合HBuilderX与Android Studio,手把手教你搭建本地编译环境、配置原生工程、执行核心打包流程,并分享快速更新资源和排查常见问题的技巧,助你彻底摆脱云端打包的排队依赖,实现高效、可控的应用构建。

weixin_28835551的博客 558

OpenClaw人人养虾:接入Synology Chat

Synology Chat 是群晖 NAS(Network Attached Storage,网络附属存储)内置的即时通讯应用。

王国平的博客 780

大整数的高精度运算(加减乘除移位)

突破数据类型限制

m0_70865803的博客 1870

STM32F407+OV2640的DCMI+DMA双缓冲JPEG图像采集系统

在嵌入式视觉系统中,数字摄像头接口(DCMI)是MCU连接CMOS图像传感器的关键硬件通道,其与DMA协同实现零CPU干预的高速数据流采集;而JPEG作为一种基于DCT变换与量化压缩的有损图像格式,依赖传感器端硬件编码引擎才能满足实时性要求。理解DCMI三重同步时序(PCLK/HSYNC/VSYNC)与DMA双缓冲机制的流水线协作原理,是突破带宽瓶颈、避免FIFO溢出和帧丢失的技术基础。该架构广泛应用于智能硬件、工业检测与边缘AI前端等需低功耗、高可靠图像捕获的场景,本文以OV2640与STM32F407为

weixin_42103128的博客 156

C语言强化训练(10)

前言:截止现在,我们C语言的大部分基础内容就已经讲完了,但是,光掌握基础只是还是不够的,所以小编会将自己写过的一些题整理起来,不定期更新刷题博客,希望能扩展大家的思路。话不多说,现在就开始我们这一节的刷题博客吧!!

pusue_the_sun的博客 1097

【ESP 保姆级教程】第三方库篇 ——TimeLib库,一个非常Nice的时间库,结合第三方进行校正时间

Time,这是一个为Arduino提供时间支持的库。 这个库的例子中会教会我们多种方式去获取时间: - 一个`RTC`时钟 - 网络`NTP`时间 - `GPS`时间

单片机菜鸟哥的博客 3674

初识数据之特征选择

【代码】初识数据之特征选择。

M_inherit的博客 1134

CPU 架构:位数、指针、寄存器、SIMD 与高性能计算

CPU 位数(Bit Width)通常指的是 CPU 内部通用寄存器(General Purpose Registers)的宽度。它定义了 CPU单次时钟周期内能处理的一个整数(Word, 字长)的二进制位数。传统 CPU 运算模式是SISD(单指令单数据),即“一条指令处理一个数据”。而SIMD允许“一条指令同时处理多个数据”。A[0]+B[0]到A[3]+B[3]。普通模式:需执行4 次加法指令。SIMD 模式:利用128 位宽的寄存器(容纳 4 个 32 位 float),一次性打包加载,执行。

qq_53053113的博客 1257

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

alu和mdr位数相等吗_C语言指针难吗?纸老虎而已,纯干货讲解

指针对于C来说太重要。然而,想要全面理解指针,除了要对C语言有熟练的掌握外,还要有计算机硬件以及操作系统等方方面面的基本知识。所以本文尽可能的通过一篇文章完全讲解指针。为什么需要指针?指针解决了一些编程中基本的问题。第一,指针的使用使得不同区域的代码可以轻易的共享内存数据。当然小伙伴们也可以通过数据的复制达到相同的效果,但是这样往往效率不太好。因为诸如结构体等大型数据,占用的字节数多,复制很消耗性...

weixin_42438750的博客 354

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

一,编码,系统位数,cmd使用,简单程序

在ASSIC码中  每一个字符统一都需要8个bit来存储一位=1bit1个字节=1bytes=8bit在Unicode 万国码中 每一个字符统一占两个字节即16个bit支持中文的第一张表叫做 GB2312 (1980 gb2312 6700+个中文;1995 gbk1.0 20000个中文;2000 gb18030 27000个中文;big5 台湾)UTF-8 = unicode 的扩展集,可变长的字符编码集 在UTF-8中一个字符占3个字节。

theshuid的博客 295

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

数据的表示和运算

1.原码,补码,反码符号位相同,正数机器码相同2.原码,反码在数轴上对称,都存在+0和-0两个03.补码,移码在数轴不对称,零表示唯一,比原码,反码多表示一个数4.原码容易判断大小,负数的反码,补码很难判断大小。

weixin_73376914的博客 677

C语言:内存中程序是如何运行的

程序是保存在硬盘中的,要载入内存才能运行,CPU 也被设计为只能从内存中读取数据和指令。对于 CPU 来说,内存仅仅是一个存放指令和数据的地方,并不能在内存中完成计算功能,例如要计算 a = b +c,必须将 a、b、c 都读取到 CPU 内部才能进行加法运算。为了了解具体的运算过程,我们不妨先来看一下CPU 的结构。CPU 是一个复杂的计算机部件,它内部又包含很多小零件,如下图所示:运算单元是 CPU 的大脑,负责加减乘除、比较、位移等运算工作,每种运算都有对应的电路支持,速度很快。

Dola的博客 1716
上一篇: C语言 - 日期计算器
下一篇: ascii码二进制十进制十六进制对照表
四夕、
博客等级 码龄8年 19粉丝 39原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值