熱門: 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
發(fā)布時(shí)間: 2021-3-12 15:19
正文摘要:想請(qǐng)教各位大佬關(guān)于STC89C52除法的問題。 大概就是發(fā)現(xiàn)程序在沒有準(zhǔn)確算出這個(gè)式子的結(jié)果,調(diào)試出來的結(jié)果也很奇怪。 個(gè)人猜測(cè)是和STC89C52只有8位有關(guān),但是由于自己單片機(jī)原理方面不太懂,所以想請(qǐng)教一下大家。 ... |
王快活。 發(fā)表于 2021-3-15 12:09 你修改代碼再試一下, volatile unsigned int temp; 增加一個(gè)關(guān)鍵字試試 |
王快活。 發(fā)表于 2021-3-15 12:09 我覺得樓上說的對(duì),可能是被優(yōu)化了 |
hefq 發(fā)表于 2021-3-12 22:07 大佬你的keil配色可以分享一下嗎? |
感謝各位大佬的耐心解答,我參考了這篇帖子 https://blog.csdn.net/avideointerfaces/article/details/27512485 應(yīng)該是溢出了 |
我測(cè)試正確的,結(jié)果是0x001F |
unsigned int temp; temp=100*155/500; |
51hei瀏覽器截圖20210314234538.png (4.27 KB, 下載次數(shù): 58)
void main(void) { unsigned int temp,a; temp = 200*255/500;a=temp; }.試試這個(gè),然后你再看運(yùn)算結(jié)果。我懷疑你并沒有執(zhí)行運(yùn)算,你定義temp的時(shí)候沒有賦初值,Value=0XFFE可能是temp運(yùn)算之前的隨機(jī)值,按我給出的例子,當(dāng)你指針指到a=temp;的時(shí)候再看temp的值 |
參與人數(shù) 1 | 黑幣 +20 | 收起 理由 |
---|---|---|
![]() | + 20 | 回帖助人的獎(jiǎng)勵(lì)! |
數(shù)字有沒有溢出? |
也可能是temp沒有用,被優(yōu)化了,整個(gè)除法沒有執(zhí)行 |
參與人數(shù) 1 | 黑幣 +20 | 收起 理由 |
---|---|---|
![]() | + 20 | 回帖助人的獎(jiǎng)勵(lì)! |
編譯器默認(rèn)是按有符號(hào)16位運(yùn)行,200*255溢出了 a=200u*255/500應(yīng)該可行 |
參與人數(shù) 1 | 黑幣 +20 | 收起 理由 |
---|---|---|
![]() | + 20 | 回帖助人的獎(jiǎng)勵(lì)! |
本帖最后由 wulin 于 2021-3-12 21:48 編輯 強(qiáng)制轉(zhuǎn)換數(shù)據(jù)類型,200和255默認(rèn)為unsigned char型,500默認(rèn)為unsigned int型。類型統(tǒng)一就不會(huì)錯(cuò)了。 tepm=(unsigned int)(200*255)/500;也可以分兩步計(jì)算也不會(huì)錯(cuò)。 tepm=200*255; tepm=tepm/500; |
參與人數(shù) 1 | 黑幣 +20 | 收起 理由 |
---|---|---|
![]() | + 20 | 回帖助人的獎(jiǎng)勵(lì)! |
確實(shí)碰到過這類問題,我的解決方案是: unsigned int a , temp; a = 200*255; temp = a / 500; 這樣就不會(huì)有錯(cuò),估計(jì)是編譯器的問題。 |
參與人數(shù) 1 | 黑幣 +20 | 收起 理由 |
---|---|---|
![]() | + 20 | 回帖助人的獎(jiǎng)勵(lì)! |
game灬boy 發(fā)表于 2021-3-12 16:55 這是我特意新建的一個(gè)工程,整個(gè)代碼就下面幾句 #include <reg52.h> void main(void) { unsigned int temp; temp = 200*255/500; } |
不應(yīng)該吧,是不是其他地方把改變值了? 計(jì)算的時(shí)候應(yīng)該是有高位寄存器和低位寄存器啊, 像定時(shí)器初始化時(shí)就寫到過(65535 - 1000) / 256 |
參與人數(shù) 1 | 黑幣 +20 | 收起 理由 |
---|---|---|
![]() | + 20 | 回帖助人的獎(jiǎng)勵(lì)! |
這個(gè)叫 取模,也就是 除法運(yùn)算 保留了商 丟棄了余數(shù) ,取余用% |
Powered by 單片機(jī)教程網(wǎng)