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

Windows 2000系统下载与全套镜像安装:从镜像校验到驱动兼容性实战指南

操作系统镜像文件是安装系统的核心载体,其完整性直接影响部署成败。哈希校验作为验证文件一致性的基础手段,能有效避免因镜像损坏导致的安装中断。对于已停止支持的操作系统,如Windows 2000,其镜像获取与安装更具挑战性,但它在工业控制、专用终端及怀旧技术研究中仍有不可替代的价值。通过理解镜像命名规则、服务包等级(如SP4)及引导方式,结合虚拟机或老硬件平台,可以顺利完成部署。同时,驱动兼容性是老系统运行的关键瓶颈,需针对性解决网卡、显卡等外设驱动问题。本文从镜像下载、校验到安装配置,系统梳理了Windows

weixin_32050773的博客 343

vscode运行.ipynb代码时提示需要安装ipykernel包的解决办法

此文目的是为了记录遇到的一些问题,也希望能帮助到和我一样遇到困难的同学。如需转载,请注明出处。在使用vscode运行.ipynb文件中提示需要安装ipykernel包的提示,在网上查询了很多方法之后也是终于解决了问题。写下这篇博客也希望能帮到大家。

qq_58018041的博客 4万+

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

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

weixin_30394669的博客 739

3D点云处理:PointNet++与PointTransformer的对比

摘要: 3D点云处理中,PointNet++和PointTransformer是两种主流深度学习模型。PointNet++通过分层采样和分组策略提取局部特征,而PointTransformer利用自注意力机制捕捉全局上下文。实验表明,PointTransformer在分类(ModelNet40准确率92.1%)和分割(ShapeNet mIoU 85.7%)任务上性能更优,但计算开销较大(训练时间180秒/轮)。PointNet++在实时性场景更具优势(训练时间120秒/轮)。未来可结合两者优势,或优化Tr

shejizuopin的博客 1121

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

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

张巧龙的博客 8814

044、Edge Impulse的音频分类实战

上周调试一块STM32WBA52开发板,板载PDM麦克风死活采不到有效数据。示波器怼上去,时钟线波形漂亮得像教科书,数据线却像心电图——全是毛刺。折腾半天发现是电源纹波干扰,给麦克风单独加了个LC滤波,世界清净了。这种坑,做音频分类的嵌入式工程师迟早要踩一遍。

2401_88858637的博客 54

Vibe Writing 手把手教程:Obsidian + Claudian + Skill

本文介绍了Vibe Writing的实操教程,主要使用Obsidian+Claudian+Skill组合。教程包含工具安装配置(Obsidian、Claudian插件)、核心工作流(选题-调研-写作-发布)和效果对比。重点展示了Claude Code生成的文本更具"人味"和场景感,优于其他AI工具。作者强调工具只是辅助,内容灵魂仍需个人思考积累。附有公众号排版和全网发布工具推荐,以及自动配图生成方案。

299

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

突破数据类型限制

m0_70865803的博客 1870

Android 车载应用之快速入门

车载 Android 系统也被称为 Android Automotive OS,是对原始 Android 系统的一个功能扩充版本。与手机系统一样,Android Automotive OS 源代码完全开放,第三方供应商和汽车制造商可以官方源码的基础上自行开发和拓展,无论是编程语言还是各项接口,都与 Android 系统保持了一致。

xiangzhihong8的专栏 1112

C语言强化训练(10)

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

pusue_the_sun的博客 1097

【RT-DETR多模态融合改进】在前期、中期、中后期、后期多模态融合中添加P6大目标检测层,完整步骤及代码

主题: RT-DETR的多模态融合改进中增加P6大目标检测层方式: 分别在前期融合、中期融合、中-后期融合、后期融合中增加P6多模态融合检测层。内容: 包含融合方式详解以及完整配置步骤,开箱即用,一键运行。原始模型结构如下: 二、有效特征层对应的检测头类别 2.1 P3/8 - small检测头 原始模型中的对应的检测头主要用于检测相对较小的目标。其特征图大小相对较大,空间分辨率较高。 适合检测尺寸大概在到像素左右的目标。 2.2 P4/16 - medium检测头 这个检测头对应的经过了更多的下采样

Limiiiing的博客 392

NVIDIA Isaac Lab 入门教程(一)

Isaac Lab 是一个用于机器人学习的统一模块化框架,旨在简化机器人研究中的常见工作流程(如 RL、从演示中学习和运动规划)。它建立在英伟达 Isaac Sim 的基础上,利用最新的仿真功能实现逼真的场景和快速高效的仿真。该框架的核心目标是Isaac Lab 的主要功能包括:由 PhysX 提供的快速准确的物理模拟、用于矢量化渲染的平铺渲染 API、用于提高鲁棒性和适应性的域随机化,以及对在云中运行的支持。有关该框架的更多信息,请参阅论文[MYY+23]。

机器人控制与仿真应用 8218

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

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

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

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

weixin_42438750的博客 354

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

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

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是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、付费专栏及课程。

余额充值