找回密码
 立即注册
查看: 107|回复: 6

Ai8051U如何进行强制64位类型转换 | 已清楚实际情况

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:11
  • 最近打卡:2025-08-17 18:18:56

18

主题

58

回帖

323

积分

中级会员

积分
323
发表于 2025-8-13 14:13:23 | 显示全部楼层 |阅读模式
首先使用Keil C251编译器,好像Ai8051不支持64位整数定义,我查了STC的论坛。把STC32的“LONG64.H”包含进项目里发现可以进行64位整数定义了
LONGLONG K;
但是我想进行强制类型转换时仍然报错,请问如何操作?
(LONGLONG)SYSCLK*160  //SYSCLK=40,000,000
Sources\main.c(77): error C84: illegal type conversion


LONG64.H见下面压缩文件 LONG64.7z (809 Bytes, 下载次数: 3)




若编译器确实不支持,我想用DPU32的汇编指令实现
能否提供示例代码:比如下面这段,我想用DPU32的汇编指令实现(C语言内嵌DPU32汇编),如何编写程序

SYSCLK*abc/val      //SYSCLK=40,000,000, abc为16位整数,val为32位整数
回复

使用道具 举报 送花

3

主题

2031

回帖

910

积分

等待验证会员

积分
910
发表于 2025-8-13 14:18:00 | 显示全部楼层
针对您在使用Ai8051开发平台时遇到的“强制64位类型转换”问题,以下为专业解答:

首先,确认您的开发环境为Keil C251编译器,并且您已尝试通过包含STC32中的LONG64H头文件实现64位整数定义。虽然该方式可使LONGLONG K;等语句成功编译,但在进行强制类型转换时仍出现错误:error C84: illegal type conversion。

此问题的根本原因在于,Ai8051平台本身并不支持标准的64位整数类型(如long long或LONGLONG),即使通过第三方头文件引入了类似类型定义,其底层实现仍可能与编译器兼容性不匹配,导致类型转换失败。

一、问题分析

1. 编译器限制  
   Keil C251是为8051架构设计的编译器,其对数据类型的处理仅限于16位或32位整数,不支持原生64位整数类型。尽管通过LONG64H头文件可以定义类似LONGLONG的结构体或宏,但该类型并非编译器原生支持的数据类型,因此无法直接进行强制类型转换。

2. 类型转换机制不兼容  
   SYSCLK160可能是一个unsigned int或unsigned long类型的变量,而LONGLONG类型可能是基于结构体或联合体的自定义类型。由于两者在内存布局和类型标识符上不一致,编译器无法识别并执行合法的类型转换,从而报错C84: illegal type conversion。

二、解决方案建议

方法一:使用指针方式进行间接赋值

若需将一个32位数值转换为64位格式,可通过指针操作将低32位赋值给64位变量的低位部分,高位部分设为0。
  1. c
  2. LONGLONG K;
  3. unsigned long src = SYSCLK160;
  4. // 将32位数值赋值给64位变量的低32位
  5. ((unsigned long)&K) = src;
  6. ((unsigned long)((unsigned char)&K + 4)) = 0; // 高位部分清零
复制代码
注意:此方法依赖于平台的字节序(大端/小端)。在8051平台上通常为小端序,因此上述代码适用于大多数情况。

方法二:使用函数封装转换逻辑

创建一个函数,用于将32位数值转换为64位格式,避免直接使用强制类型转换。
  1. c
  2. void ConvertToLONGLONG(LONGLONG dest, unsigned long src) {
  3.     dest->low = src;
  4.     dest->high = 0;
  5. }
复制代码

调用方式如下:
  1. c
  2. LONGLONG K;
  3. ConvertToLONGLONG(&K, SYSCLK160);
复制代码

方法三:检查LONG64H的实现是否适配

若LONG64H中定义的LONGLONG为结构体类型,例如:
  1. c
  2. typedef struct {
  3.     unsigned long low;
  4.     unsigned long high;
  5. } LONGLONG;
复制代码

则不能直接将其与普通unsigned long类型进行强制转换。应使用成员访问方式赋值,而非类型转换。

三、结论

Ai8051平台及Keil C251编译器不支持原生64位整数类型,因此无法直接对LONGLONG进行强制类型转换。建议采用指针操作或函数封装的方式实现数值转换,以规避编译器限制。同时,确保LONG64H中定义的LONGLONG类型与实际需求一致,避免因类型定义不匹配导致的错误。

如需进一步优化性能或扩展功能,可考虑使用浮点数或分段存储策略替代64位整数运算。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:184
  • 最近打卡:2025-08-23 08:44:04

16

主题

557

回帖

2923

积分

超级版主

积分
2923
发表于 2025-8-13 14:26:18 | 显示全部楼层
Keil软件对 整型类型 和 浮点类型 的支持 | 专业解决方案
https://www.stcaimcu.com/thread-19222-1-1.html
(出处: 国芯人工智能技术交流网站)
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:11
  • 最近打卡:2025-08-17 18:18:56

18

主题

58

回帖

323

积分

中级会员

积分
323
发表于 2025-8-13 14:43:30 | 显示全部楼层
AI*** 发表于 2025-8-13 14:26
Keil软件对 整型类型 和 浮点类型 的支持 | 专业解决方案
https://www.stcaimcu.com/thread-19222-1-1.html ...

若编译器确实不支持,我想用DPU32的汇编指令实现
能否提供示例代码:比如下面这段,我想用DPU32的汇编指令实现(C语言内嵌汇编),如何编写程序

SYSCLK*abc/val      //SYSCLK=40,000,000, abc位16位整数,val为32位整数

点评

目前搭载DPU32的单片机还在流片中,尚未开始销售  详情 回复 发表于 2025-8-13 16:02
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:498
  • 最近打卡:2025-08-23 08:57:24
已绑定手机

45

主题

2172

回帖

7590

积分

论坛元老

积分
7590
发表于 2025-8-13 15:48:19 | 显示全部楼层
DPU32是AI8052U才有的功能
截图202508131548016331.jpg

如果你想定义64位变量,或者将其他变量数据类型转成64位,可用3楼链接的方法。
LONG64.h 头文件里面的"LONGLONG"是一个结构体:
  1. typedef struct  { unsigned long h;             // 可以按长字寻址,寻址双长字的高位
  2.                         unsigned long l;               // 可以按长字寻址,寻址双长字的低位
  3.                 }LONGLONG;       //定义一个可以按长字寻址,寻址双长字的高位和低位的无符号双长字?
复制代码
你可以用它来定义一个结构体变量,但是不能把其他变量转成结构体类型。
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:547
  • 最近打卡:2025-08-21 21:27:12
已绑定手机
已实名认证

116

主题

2712

回帖

6806

积分

版主

积分
6806
发表于 2025-8-13 16:02:44 | 显示全部楼层
firef*** 发表于 2025-8-13 14:43
若编译器确实不支持,我想用DPU32的汇编指令实现
能否提供示例代码:比如下面这段,我想用DPU32的汇编指令 ...

目前搭载DPU32的单片机还在流片中,尚未开始销售
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:11
  • 最近打卡:2025-08-17 18:18:56

18

主题

58

回帖

323

积分

中级会员

积分
323
发表于 2025-8-13 17:11:09 | 显示全部楼层
乘风*** 发表于 2025-8-13 15:48
DPU32是AI8052U才有的功能

谢谢,我发的时候忘了是8052的功能了。因为在8051的规格书上
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-8-24 02:36 , Processed in 0.123385 second(s), 80 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表