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

深度学习PyTorch代码模板——模型训练框架、数据处理、绘图…

个人用深度学习代码模板:模型训练框架、数据处理、绘图等。待补充。

https://www.hyperplasma.top 1908

使用 pip 安装 pygame 遇到的问题

今天尝试学习使用 pygame 时,按照我的习惯一发 pip install 下去,本以为很简单的事情,没想到遇到了不少问题,顺手记录一下。 0x01. 无法找到 “SDL.h” 文件 pygame 是使用 SDL 库写就的游戏框架,自然强依赖于 SDL,我的 python@3 是使用 macOS 的 brew 管理器直接安装的,可能由于不是编译安装的问题,缺少了这个库,继续使用 brew 安...

Mitscherlich的博客 8621

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

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

weixin_30394669的博客 739

【TensorRT】TensorRT C# API 项目介绍:基于C#与TensorRT部署深度学习模型(上篇)

开发了TensorRT C# API 2.0版本,该版本在开发时充分考虑了上一版本应用时出现的问题,并进行了改进。同时在本版本中,我们对接口进行了优化,使用起来更加简单,并同时提供了相关的应用案例,方便开发者进行使用。

grape_yan的博客 3038

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

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

张巧龙的博客 8814

效果炸裂_安装midscene_copw基于midscene操作电脑_基于视觉的软件测试执行_MIDSCENE的安装和使用---AI大模型应用探索0012

摘要:本文介绍了如何通过安装MidSceneJS来增强Copaw的屏幕操作能力。首先需要安装Node.js和npm,并配置淘宝镜像源加速安装。然后全局安装MidScene CLI工具(npm install @midscene/cli -g)。接着配置视觉大模型服务,通过设置环境变量指定模型API密钥、名称、基础URL和家族类型(如qwen3.5-27b),配置文件需存放在C:\Users\Administrator.copaw目录。安装成功后,MidScene已能成功识别并操作屏幕,使用效果良好。文中还提

添柴程序猿的专栏 639

基于MATLAB的拉盖尔-高斯光束叠加相位模拟

首先,我们需要设置模拟所需的参数,如光腰半径、传播距离、光束的角动量等。其中,(U)表示光束的电场复振幅,(r)和(\phi)分别是极坐标系下的径向和角向坐标,(z)是传播距离,(A)是归一化系数,(w_p)是光束的光腰半径,(L_p^q)是拉盖尔多项式,(k)是波数,(l)是光束的角动量。通过修改模拟参数,如光腰半径、传播距离、角动量等,您可以进一步探索和理解拉盖尔-高斯光束的叠加相位效应。拉盖尔-高斯光束是一种特殊的光束模式,具有广泛的应用领域,包括光学信息处理、激光加工和量子光学等。

m0_47037246的博客 945

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

突破数据类型限制

m0_70865803的博客 1870

基于Blender的AI插件——2D图片生成3D模型

只需5分钟即可从图片到可编辑3D模型,支持Blender全版本兼容。

这里汇聚了前沿的技术分享与实用的开发技巧,带你探索从创意到企业的技术创业之路。 2576

C语言强化训练(10)

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

pusue_the_sun的博客 1097

C#winform自定义绘制曲线控件实例

本文实例讲解自定义绘制曲线控件过程。 在实际项目中,需要绘制曲线,系统的提供的绘制曲线的控件有时不能满足自己的需要,需要根据项目需要定制开发曲线控件。 实例目标,实时绘制显示温湿度值曲线。

qq_30725967的博客 1734

Cadence PSpice 仿真0:绘制电路图方法图文教程

在使用PSpice进行电路的仿真时,首先需要使用带有PSpice模型的元器件来绘制电路图,本文简单介绍进行电路图绘制是常用的几种需要掌握的方法,以满足PSpice仿真绘制简单电路图所用。

fydar的博客 4703

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

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

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

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

weixin_42438750的博客 354

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

一,编码,系统位数,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

数据的表示和运算

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、付费专栏及课程。

余额充值