久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 6624|回復(fù): 23
收起左側(cè)

納悶,51單片機(jī)無(wú)法計(jì)算乘積為上萬(wàn)的乘法?

  [復(fù)制鏈接]
ID:71233 發(fā)表于 2019-8-29 11:34 | 顯示全部樓層 |閱讀模式
本帖最后由 新新科技 于 2019-8-29 12:01 編輯

這幾天在設(shè)計(jì)一段程序時(shí),需要計(jì)算相乘積為上萬(wàn)甚至上十萬(wàn)的乘法運(yùn)算,大致是這樣的:
      unsigned int tt;//使用STC單片機(jī)
      tt=(shuiliang*(100-temp)*0.01;//
其中,shuiliang值為800至1500,temp值為0至100。
通過(guò)多次的試驗(yàn),明明shuiliang(指定1500)和temp(指定30)的代入數(shù)值不會(huì)出錯(cuò),但tt的計(jì)算結(jié)果總是出錯(cuò)(用Proteus_7.5仿真或?qū)嵨锞绱耍娴暮芗{悶,后來(lái)通過(guò)分析,難道51單片機(jī)真的無(wú)法計(jì)算乘積為上萬(wàn)的乘法?最終確定改變運(yùn)算順序(先除,讓乘積不再太大),具體如下:
      tt=(shuiliang/100)*(100-temp);
這樣的運(yùn)算順序,計(jì)算結(jié)果才是正確的。
請(qǐng)教各位大師,51單片機(jī)在做乘法計(jì)算的,最大只能完成乘積為多少的乘法運(yùn)算?

回復(fù)

使用道具 舉報(bào)

ID:149144 發(fā)表于 2019-8-29 15:57 | 顯示全部樓層
unsigned int tt ; 最大值是多少 ?   65535 ??
1500 * 70 = 105000  
回復(fù)

使用道具 舉報(bào)

ID:401564 發(fā)表于 2019-8-29 16:12 | 顯示全部樓層
理論上來(lái)說(shuō),8051可以計(jì)算無(wú)限大運(yùn)算,所有運(yùn)算,包括微積分之類的高數(shù)
而實(shí)際上,8051的能力只能說(shuō)是可以無(wú)限接近無(wú)限,總的來(lái)說(shuō)的,10億以內(nèi)的運(yùn)算是絕對(duì)可以的。
對(duì)于C的計(jì)算來(lái)說(shuō),它取決于KEIL這個(gè)軟件的編譯器,不同類型的數(shù)據(jù)類型就會(huì)有不同的長(zhǎng)度,運(yùn)算結(jié)果超過(guò)這個(gè)長(zhǎng)度的,就會(huì)不要了
而在C中,不同數(shù)據(jù)類型進(jìn)行運(yùn)算時(shí),會(huì)先強(qiáng)制轉(zhuǎn)換成同一個(gè)類型再進(jìn)行運(yùn)算,而你這個(gè)就是這種情況
你想要運(yùn)算結(jié)果正確,所有的數(shù)據(jù)類型得是:雙精度浮點(diǎn)數(shù),好像KEIL中這個(gè)類型應(yīng)該是有16位的,如果長(zhǎng)度是16位的,那么:在65536以下的運(yùn)算就是正確的,超過(guò)這個(gè)值的就只取16位的結(jié)果,如果是32位長(zhǎng)度,那就更精確了
回復(fù)

使用道具 舉報(bào)

ID:149389 發(fā)表于 2019-8-29 16:29 | 顯示全部樓層
本帖最后由 weidoit 于 2019-8-29 16:46 編輯


1500*(100-30)=105000  (存不下了),試試長(zhǎng)整型。
回復(fù)

使用道具 舉報(bào)

ID:71233 發(fā)表于 2019-8-29 17:27 | 顯示全部樓層
1500*100=150000,乘積超過(guò)65536,那是一定的,只不過(guò)這個(gè)結(jié)果不是最終的結(jié)果,因?yàn)楹竺孢要除以100,具體見上面的計(jì)算式子。問(wèn)題出在KEIL,那是極有可能的,因?yàn)槲矣玫陌姹臼?.5版的。
回復(fù)

使用道具 舉報(bào)

ID:401564 發(fā)表于 2019-8-30 00:44 | 顯示全部樓層
這跟后面除以100沒(méi)有關(guān)系的,超過(guò)16位的數(shù)字,就只取16位的數(shù)據(jù),多出來(lái)的就不要了
你可以使用long型數(shù)據(jù),,32位,足夠你用的了
回復(fù)

使用道具 舉報(bào)

ID:511890 發(fā)表于 2019-8-30 01:09 | 顯示全部樓層
不是單片機(jī)的問(wèn)題,是C語(yǔ)言變量類型字節(jié)長(zhǎng)度的問(wèn)題。U int 最大值65535。把tt的類型unsigned int改為long就行
回復(fù)

使用道具 舉報(bào)

ID:65956 發(fā)表于 2019-8-30 08:35 | 顯示全部樓層
unsigned int tt;把這個(gè)改為unsigned long tt;就OK了,這個(gè)最大可以達(dá)到4294967295,這是最大值
回復(fù)

使用道具 舉報(bào)

ID:208271 發(fā)表于 2019-8-30 08:58 | 顯示全部樓層
8051單片機(jī)是8位單片機(jī),數(shù)據(jù)儲(chǔ)存器是16位的,最大的數(shù)據(jù)是65536,超過(guò)這個(gè)數(shù)據(jù)單片機(jī)儲(chǔ)存就有問(wèn)題,但對(duì)于程序來(lái)說(shuō),就是定義問(wèn)題,定義int就65536,超過(guò)了就會(huì)溢出,采用LONG或者FLOAT型,這是編譯器的問(wèn)題。還是要了解一下編譯器的C語(yǔ)言用法。
回復(fù)

使用道具 舉報(bào)

ID:208271 發(fā)表于 2019-8-30 09:02 | 顯示全部樓層
unsigned int tt;//使用STC單片機(jī)tt=(shuiliang*(100-temp)*0.01;/
這個(gè)tt是int類型,不能*0.01,可以/100,數(shù)據(jù)類型不對(duì)一樣出錯(cuò)的,編譯器不會(huì)自動(dòng)轉(zhuǎn)換識(shí)別數(shù)據(jù)類型的,把tt改為float可以用*0.01,不會(huì)出錯(cuò)。
樓主還是要了解清楚C的數(shù)據(jù)類型啊!
回復(fù)

使用道具 舉報(bào)

ID:605370 發(fā)表于 2019-8-30 09:34 | 顯示全部樓層
建議你更換數(shù)據(jù)類型,int長(zhǎng)度不夠,試試long
回復(fù)

使用道具 舉報(bào)

ID:71233 發(fā)表于 2019-8-30 18:12 | 顯示全部樓層
改為
    unsigned long tt;
    tt=(shuiliang*(100-temp)/100;
照常不行!
回復(fù)

使用道具 舉報(bào)

ID:71233 發(fā)表于 2019-8-30 18:22 | 顯示全部樓層
無(wú)論把tt改為什么類型都不行,我總是覺(jué)得要么是編譯器的限制,要么就是51單片機(jī)的只能分配2個(gè)字節(jié)的寄存器來(lái)存儲(chǔ)運(yùn)算過(guò)程中的中間數(shù),我檢驗(yàn)了,的確在計(jì)算乘法的時(shí)候,超過(guò)兩個(gè)八位字節(jié)的,只截取了后面兩個(gè)字節(jié)的數(shù)值,如1500*100=150000=0x249F0,結(jié)果只有0x49F0繼續(xù)參加后面的計(jì)算。
回復(fù)

使用道具 舉報(bào)

ID:401564 發(fā)表于 2019-8-30 23:08 | 顯示全部樓層
我的天呀!為什么會(huì)這這種想法呢,根本是你自己的方法不對(duì)
所有的變量都統(tǒng)一的改成long型,所有的!
temp不是變量嗎?shuiliang是不是呢?
那么多人幫你回答了那么多
你是怎么驗(yàn)證的呢?
還是我前面的回答:10億以內(nèi)的運(yùn)算是可以的,難道你沒(méi)有見過(guò)或者聽說(shuō)過(guò)基于8051的計(jì)算器嗎
回復(fù)

使用道具 舉報(bào)

ID:370639 發(fā)表于 2019-8-31 08:24 | 顯示全部樓層
數(shù)據(jù)類型不對(duì)吧
回復(fù)

使用道具 舉報(bào)

ID:149642 發(fā)表于 2020-6-11 22:31 | 顯示全部樓層
匯編都可以算到億億以上,只要你的寄存器夠多,
ABCDEF*ABCDEF=(AB*100*100+CD*FF+EF)*(AB*100*100+CD*FF+EF)
回復(fù)

使用道具 舉報(bào)

ID:491577 發(fā)表于 2020-6-14 18:36 | 顯示全部樓層
樓主不明白單片機(jī)計(jì)算中每一步都不能夠有數(shù)據(jù)溢出,否則出錯(cuò),不是最后一步不溢出就行。用強(qiáng)制轉(zhuǎn)換就可以了。比如: tt=(shuiliang*(100-temp)/100;改成: tt=((long)shuiliang*(100-temp)/100;
回復(fù)

使用道具 舉報(bào)

ID:877285 發(fā)表于 2021-2-1 09:38 | 顯示全部樓層
解決問(wèn)題沒(méi),我和你的問(wèn)題一樣
回復(fù)

使用道具 舉報(bào)

ID:712493 發(fā)表于 2021-2-1 14:21 | 顯示全部樓層
hhh402 發(fā)表于 2020-6-14 18:36
樓主不明白單片機(jī)計(jì)算中每一步都不能夠有數(shù)據(jù)溢出,否則出錯(cuò),不是最后一步不溢出就行。用強(qiáng)制轉(zhuǎn)換就可以了 ...

看看 這個(gè)對(duì)頭  還是數(shù)據(jù)類型的問(wèn)題 不行就一步一步寫嘛
回復(fù)

使用道具 舉報(bào)

ID:882150 發(fā)表于 2021-2-1 19:26 | 顯示全部樓層
數(shù)據(jù)類型有問(wèn)題 建議用long
回復(fù)

使用道具 舉報(bào)

ID:877285 發(fā)表于 2021-2-2 09:01 | 顯示全部樓層
實(shí)例1:  gPWM.Duty 輸出值為異常值
         Test_A = (long)4580;
          
          Test = (long)Test_A*(long)100;
          
          gPWM.Duty = Test / (gPWM.High_Cnt + gPWM.Low_Cnt);

實(shí)例2:  gPWM.Duty 輸出值為正常值   
          
          Test = (long)4580*(long)100;
          
          gPWM.Duty = Test / (gPWM.High_Cnt + gPWM.Low_Cnt);

誰(shuí)能解釋為啥?
回復(fù)

使用道具 舉報(bào)

ID:879809 發(fā)表于 2021-2-2 18:10 | 顯示全部樓層
die123123 發(fā)表于 2021-2-2 09:01
實(shí)例1:  gPWM.Duty 輸出值為異常值
         Test_A = (long)4580;
          

類似 (long)4580的寫法改成4580l。
回復(fù)

使用道具 舉報(bào)

ID:158467 發(fā)表于 2021-7-6 09:39 | 顯示全部樓層
Y_G_G 發(fā)表于 2019-8-30 23:08
我的天呀!為什么會(huì)這這種想法呢,根本是你自己的方法不對(duì)
所有的變量都統(tǒng)一的改成long型,所有的!
temp不是 ...

統(tǒng)一換成長(zhǎng)整型也有問(wèn)題,這個(gè)跟編譯器的IDE是否能自動(dòng)識(shí)別 類型和準(zhǔn)確隱式轉(zhuǎn)換有關(guān),存在常量100就會(huì)默認(rèn)為表達(dá)式為16位的運(yùn)算,解決方法1是如樓主的:前面先除以100,控制數(shù)據(jù)在16位數(shù)據(jù)內(nèi),這樣是可以的。另一種方法是:先定義位unsiged long  tt;   tt=((unsiged long)shuiliang/(unsiged long)100)*((unsiged long)100-(unsiged long)temp))
回復(fù)

使用道具 舉報(bào)

ID:158467 發(fā)表于 2021-7-6 09:39 | 顯示全部樓層
統(tǒng)一換成長(zhǎng)整型也有問(wèn)題,這個(gè)跟編譯器的IDE是否能自動(dòng)識(shí)別 類型和準(zhǔn)確隱式轉(zhuǎn)換有關(guān),存在常量100就會(huì)默認(rèn)為表達(dá)式為16位的運(yùn)算,解決方法1是如樓主的:前面先除以100,控制數(shù)據(jù)在16位數(shù)據(jù)內(nèi),這樣是可以的。另一種方法是:先定義位unsiged long  tt;   tt=((unsiged long)shuiliang/(unsiged long)100)*((unsiged long)100-(unsiged long)temp))
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 91精品国产综合久久久密闭 | 国产精品不卡视频 | 操久久 | 在线观看日韩精品视频 | 亚洲精品一区中文字幕乱码 | 久久久久黑人 | 精品国产视频 | 国产精品九九九 | 国产区在线观看 | 99免费精品 | 成人免费片 | 成人在线免费av | 国产区在线 | 一区二区成人在线 | 黄色大片网站 | 欧美精品久久久久久久久老牛影院 | 精品久久久久久亚洲精品 | 91高清视频在线观看 | 欧美亚洲综合久久 | 老司机免费视频 | 天堂在线网 | 久久中文免费视频 | 欧美亚洲另类在线 | 午夜免费观看网站 | 国产成人高清在线观看 | 国产特级毛片aaaaaa | 欧美阿v | 成人免费视频观看 | 免费一二区 | 亚洲免费视频一区 | 国产精品一区一区 | www.亚洲国产精品 | 亚洲美女网站 | 国产精品毛片久久久久久久 | 日韩一级黄色毛片 | 超黄视频网站 | 日日操视频| 殴美一级片| 91免费观看| 亚洲天堂av在线 | 久久一本 |