chineseboyzxy 发表于 2022-4-7 10:48

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

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

hamstar 发表于 2022-4-13 17:00

为什么要用unsigned long这个数据类型呢,C51不支持64bit数据类型,unsigned long会转换为unsigned int。
如果使用unsigned long数据类型,你的语法也不对,常量要用unsigned long类型,b = vol*2048ul/4095ul;

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

chineseboyzxy 发表于 2022-4-9 13:34
vol = (ADCRH

为啥左移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

页: [1]
查看完整版本: 为什么C51数值计算和实际的算术运算感觉不太一样呢