为什么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语言,不懂其中道理。 2048ul,4095ul 看起来不会啊,有完整程序没。 本帖最后由 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)
再次使用STC15系列(IAP15W4K61S4)测试结果同上,相符。
本帖最后由 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则有整数及浮点硬件处理器)
不懂C语言,抄来的一段ADC转换输出printf语句,双引号里用的是%d。 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); STC的就这玩意换一个 就好了 为什么要用unsigned long这个数据类型呢,C51不支持64bit数据类型,unsigned long会转换为unsigned int。
如果使用unsigned long数据类型,你的语法也不对,常量要用unsigned long类型,b = vol*2048ul/4095ul; hamstar 发表于 2022-4-13 17:00
为什么要用unsigned long这个数据类型呢,C51不支持64bit数据类型,unsigned long会转换为unsigned int。
...
数值运算式里加后缀,能行吗? chineseboyzxy 发表于 2022-4-14 12:38
数值运算式里加后缀,能行吗?
C51不支持64位数据类型,加后缀ul没有意义。在32位芯片,要是使用unsigned long类型常量,就要加后缀,否则系统报错或者警报 数值要转换16位32位 是不是超出变量最大范围了? chineseboyzxy 发表于 2022-4-9 13:34
vol = (ADCRH
为啥左移4位,而不是8位 hamstar 发表于 2022-4-13 17:00
为什么要用unsigned long这个数据类型呢,C51不支持64bit数据类型,unsigned long会转换为unsigned int。
...
瞎扯淡。C51的int类型是16位的,范围-32768~32767。long类型是32位的,太有意义了。
井底之蛙也就用过几种编译器就以为全天下的编译器int类型是32位的???
页:
[1]