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

[复制链接]
8413|17
手机看帖
扫描二维码
随时随地手机跟帖
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)
c51-test-u-lu.jpg
STC8H8K64U-DIP40.jpg

使用特权

评论回复
autopccopy| | 2022-4-7 22:06 | 显示全部楼层
再次使用STC15系列(IAP15W4K61S4)测试结果同上,相符。
IAP15W4K61S4.jpg

使用特权

评论回复
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则有整数及浮点硬件处理器)


STC32G-LIB.jpg
STC32G-NOLIB.jpg
STC15W-STC8H-STC32G.jpg

使用特权

评论回复
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的就这玩意  换一个 就好了

使用特权

评论回复

评论

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

使用特权

评论回复

评论

autopccopy 2022-4-13 17:18 回复TA
keil C51 的 unsigned long 是4byte, 32位的. uint 是16位。 
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位的???

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则