![]() |
cnt是無符號整形,第二個for循環cnt>-1的判斷不對,當cnt為0后,再次執行--,cnt變為255 |
Hephaestus 發表于 2022-7-9 01:28 第8行放在第6行之前我試過了,就是將unsigned int i=0;放在while(1)之前,編譯不通過,我用的是stc8g1ko8a,P3口有4個I/O,我的(抄樓主的)程序如下 #include <STC8G.H> //#define char //#define unsigned int void main() { P3M0=0x00; P3M1=0x00; P5M0=0X00; P5M1=0X00; while(1) { unsigned int i=0; char led4=0; for(led4=0;led4<4;led4++) { P3=~(0x01<<led4); for(i=0;i<40000;i++); } for(led4=4;led4>0;led4--) { P3=~(0x08>>(4-led4)); for(i=0;i<40000;i++); } } } |
定義的數據類型就不對,Unsigned int, 不可能出現-1. 程序的循環設計需要重新修改一下 |
這是一個【數據類型】的問題!參見下面7樓的解答吧。 |
沒人注意到第8行是語法錯誤嗎? 在C89標準里面,任何變量的定義必須放在可執行語句之前,也就是第8行應該放在第6行前面。 只有C99標準才會支持第8行的寫法,但是編譯器都是默認不支持C99,要打開相關的編譯開關。 第一行說明樓主用的是C51而不是支持C99標準的MDK,C51至今依然不支持C99標準,所以樓主的代碼根本不可能通過編譯。 |
把unsigned int i=0;放到while(1)里面就可以循環左右移動了 |
tzs233 發表于 2022-7-6 15:23 1 再補充一點補碼的知識,負數在計算機中會用補碼來表示 負整數的補碼計算是將其原碼除符號位外的所有位 取反后加1,比如-1的補碼為其絕對值1(0000 0001)->所有位取反(1111 11110) -> 加1(1111 1111)即255 2、接上一點,此時cnt=255 又滿足了for循環中cnt>-1判定條件,因此它就會一一直循環下去無法退出。 3、然后循環體內(7-cnt) 也會產生負數,這樣和你想要的結果會完全不同。如在cnt=255時 7- cnt=-248 補碼 為0x08,即實際向右循環移動了8位之后變成0x80,外面又取反了一次變成 0x7f。 即P2 = 0x7f 4. 最后出現問題不要慌哈 可以借助編譯器仿真調試設置斷點、變量調試查看。都是這么過來的。 |
你的第二個循環cnt永遠減不到-1,一直減,還是0,無法正常結束循環 |
for(cnt=8;cnt>0;cnt--) |
你的第二個for循環變量類型不對,定義unsigned char是無符號數,不能設定比較負數 |
問問樓主,這個程序修改后能循環了嗎?我也是剛學,有好多的東西都一知半解的,不是很明白。 |
for循環中 -1溢出unsigned char 的范圍 當cnt=0 時滿足>-1 的條件 此時再減一次就變成255,emmm 后面的自然會出錯。 |
hb_lhw 發表于 2022-7-6 09:48 我,很贊同。 |
xuyaqi 發表于 2022-7-6 11:28 正解! |
for(cnt=7;cnt>-1;cnt--)改為for(cnt=7;cnt>0;cnt--),unsigned char cnc 不可能是負數。 |
你的aa每次左移一位,左移完8次之后沒有歸 1,所以只能循環一次 |
cnt是unsigned char,永遠大于-1,所以一直在for語句循環了。 |
把unsigned char cnt=0;改成char cnt=0; |
因為你移出去的數據,再也回不來了。你用環移指令試試? |
unsigned char cnt=0,應該在放在while(1) 循環上面 |