[C语言] 为什么C51数值计算和实际的算术运算感觉不太一样呢

[复制链接]
 楼主| chineseboyzxy 发表于 2022-4-7 10:48 | 显示全部楼层 |阅读模式
ADC结果计算:
unsigned long vol;
unsigned int b;
b = vol*2048/4095;
这样子结果就是正确的;

unsigned long vol,b;
b = vol*2048/4095;
这个样子的,结果就完全不对了,本来1.5伏的电压,成0.1伏了。
哪位高手指点一下,完全没学过C语言,不懂其中道理。
ayb_ice 发表于 2022-4-7 11:11 | 显示全部楼层
2048ul,4095ul
LcwSwust 发表于 2022-4-7 15:54 | 显示全部楼层
看起来不会啊,有完整程序没。
autopccopy 发表于 2022-4-7 21:37 | 显示全部楼层
本帖最后由 autopccopy 于 2022-4-7 21:43 编辑

不会啊。不知LZ是否使用仿真观察结果还是使用 printf函数输出的。
如果是printf函数, uint时用%u, ulong时要用%lu.

我使用keil c51 v9.60a 及STC8H8K64U (DIP40-B版) 在 STC-ISP V6.88R 测试是正常的,本例的结果都是2。

(134)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
autopccopy 发表于 2022-4-7 22:06 | 显示全部楼层
再次使用STC15系列(IAP15W4K61S4)测试结果同上,相符。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
autopccopy 发表于 2022-4-7 22:15 | 显示全部楼层
本帖最后由 autopccopy 于 2022-4-7 22:18 编辑

将本例程的头文件为STC32.H, 选用KEIL C251 V5.60版编译器重新编译,下载至STC32G12K128中,运行结果也同上,相符。

这个STC32G12K128 带硬件整数MDU, 仅需在工程中添加“STC32_MDU32_V1.1.LIB”库即可调用硬件MDU。本次也分别测试了带MDU及不带MUD的情况,结果都是正确的。


注:STC32G在大量整数乘除运算,使用硬件MDU乘法器,可提速不少。(STC16则有整数及浮点硬件处理器)


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| chineseboyzxy 发表于 2022-4-8 20:49 来自手机 | 显示全部楼层
不懂C语言,抄来的一段ADC转换输出printf语句,双引号里用的是%d。
 楼主| chineseboyzxy 发表于 2022-4-9 13:34 | 显示全部楼层
vol = (ADCRH<<4)|ADCRL;
b = vol*2048/4095;
printf("VIN=%d.%d%d%dV\r\n",b/1000,(b%1000)/100,((b%1000)%100)/10,((b%1000)%100)%10);
cub_wolf 发表于 2022-4-12 11:40 | 显示全部楼层
STC的就这玩意  换一个 就好了

评论

为黑而黑?这是讨论KEIL的C51啊。  发表于 2022-4-13 17:16
hamstar 发表于 2022-4-13 17:00 | 显示全部楼层
为什么要用unsigned long这个数据类型呢,C51不支持64bit数据类型,unsigned long会转换为unsigned int。
如果使用unsigned long数据类型,你的语法也不对,常量要用unsigned long类型,b = vol*2048ul/4095ul;

评论

keil C51 的 unsigned long 是4byte, 32位的. uint 是16位。  发表于 2022-4-13 17:18
 楼主| chineseboyzxy 发表于 2022-4-14 12:38 | 显示全部楼层
hamstar 发表于 2022-4-13 17:00
为什么要用unsigned long这个数据类型呢,C51不支持64bit数据类型,unsigned long会转换为unsigned int。
...

数值运算式里加后缀,能行吗?
hamstar 发表于 2022-4-14 22:12 | 显示全部楼层
chineseboyzxy 发表于 2022-4-14 12:38
数值运算式里加后缀,能行吗?

C51不支持64位数据类型,加后缀ul没有意义。在32位芯片,要是使用unsigned long类型常量,就要加后缀,否则系统报错或者警报
lvxinchao 发表于 2022-4-17 11:38 | 显示全部楼层
数值要  转换  16位  32位
天命风流 发表于 2022-4-28 09:02 | 显示全部楼层
是不是超出变量最大范围了?
dog_xin 发表于 2022-5-16 20:39 | 显示全部楼层

为啥左移4位,而不是8位
R2D2 发表于 2022-5-17 18:37 | 显示全部楼层
hamstar 发表于 2022-4-13 17:00
为什么要用unsigned long这个数据类型呢,C51不支持64bit数据类型,unsigned long会转换为unsigned int。
...

瞎扯淡。C51的int类型是16位的,范围-32768~32767。long类型是32位的,太有意义了。

井底之蛙也就用过几种编译器就以为全天下的编译器int类型是32位的???
懒懒熊_006 发表于 2022-6-5 15:45 | 显示全部楼层
zwsam 发表于 2022-8-10 09:08 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

963

帖子

0

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