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

QQ登錄

只需一步,快速開始

搜索
查看: 6049|回復(fù): 35
打印 上一主題 下一主題
收起左側(cè)

請(qǐng)問C語言比較數(shù)YEAR為什么不能大于255,大于會(huì)出錯(cuò)(之前的舉例程序有問題)

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
bit volatile ADCY@((unsigned)&sbstatus*8+0;
unsigned short  YEAR;
ADCY=0;YEAR=2000;

for(;;)
{

  YEAR=YEAR+1;
   if(YEAR>=2020)
   ADCY=1;

}


請(qǐng)教一下大神們:unsigned short  YEAR;改為unsigned char  YEAR;就可以編譯通過,是不是比較的數(shù)據(jù)只能用一個(gè)8位數(shù)據(jù)?用16位的數(shù)據(jù)是不可以直接比較的。我用PICC9.83編譯
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:887371 發(fā)表于 2022-6-30 15:02 | 只看該作者
我用PICC9.83編譯你的代碼,二者都可以編譯通過,并且編譯結(jié)果(分析匯編代碼)是正確的。
用unsigned char會(huì)有警告。警告信息如下:
Warning [766] FER039.C; 38. degenerate signed comparison
Warning [766] FER039.C; 38. degenerate signed comparison
Warning [1090] FER039.C; 32. variable "_year" is not used


通常編譯器是不會(huì)有問題的,你應(yīng)該檢查你的代碼。
回復(fù)

使用道具 舉報(bào)

板凳
ID:401564 發(fā)表于 2022-6-30 17:10 | 只看該作者
我這只有XC8的,但樓上已經(jīng)幫你測(cè)試過了,并沒有問題,那就像他說的那樣,檢查一下你自己的代碼
試想一下你也能明白這個(gè)道理的,再垃圾的編譯器,它也不會(huì)到連一個(gè)16位數(shù)大小都不能比較的地步吧,那三角函數(shù),浮點(diǎn)運(yùn)算怎么辦呢?
回復(fù)

使用道具 舉報(bào)

地板
ID:883242 發(fā)表于 2022-6-30 21:15 | 只看該作者
出什么錯(cuò)都不貼出來,讓大家盲猜?
回復(fù)

使用道具 舉報(bào)

5#
ID:61140 發(fā)表于 2022-6-30 21:24 | 只看該作者
你只是定義一個(gè)變量的東東,這個(gè)變量定義不能用8位變量,不然只能小于255,也可以用unsigned int 定義一個(gè)變量
回復(fù)

使用道具 舉報(bào)

6#
ID:844772 發(fā)表于 2022-7-1 09:48 | 只看該作者
我沒有試過,但如果unsigned short 通過不了,我會(huì)用 unsigned int 替代的,畢竟給單片機(jī)的編譯器嘛。
回復(fù)

使用道具 舉報(bào)

7#
ID:1037856 發(fā)表于 2022-7-1 10:11 | 只看該作者
sizeof(unsignd short),看一下這個(gè)類型是不是16位
回復(fù)

使用道具 舉報(bào)

8#
ID:887371 發(fā)表于 2022-7-1 11:35 | 只看該作者
zjswuyunbo 發(fā)表于 2022-7-1 10:11
sizeof(unsignd short),看一下這個(gè)類型是不是16位

PICC中short是16位。


回復(fù)

使用道具 舉報(bào)

9#
ID:329625 發(fā)表于 2022-7-1 19:35 | 只看該作者
數(shù)據(jù)是8位的
回復(fù)

使用道具 舉報(bào)

10#
ID:769545 發(fā)表于 2022-7-2 10:39 | 只看該作者
17337161031 發(fā)表于 2022-7-1 19:35
數(shù)據(jù)是8位的

我發(fā)現(xiàn)PICC編譯器,運(yùn)算的數(shù)據(jù)是可以用16位或浮點(diǎn)數(shù),比較數(shù)據(jù)大小卻只能是8位,是這樣的嗎?我是新手。
回復(fù)

使用道具 舉報(bào)

11#
ID:769545 發(fā)表于 2022-7-2 10:42 | 只看該作者
datouyuan 發(fā)表于 2022-6-30 15:02
我用PICC9.83編譯你的代碼,二者都可以編譯通過,并且編譯結(jié)果(分析匯編代碼)是正確的。
用unsigned cha ...

我的意思是我發(fā)現(xiàn)PICC編譯器,能運(yùn)算浮點(diǎn)數(shù)和16位數(shù)據(jù),比較數(shù)據(jù)卻只能8位。是不是設(shè)置有問題
回復(fù)

使用道具 舉報(bào)

12#
ID:769545 發(fā)表于 2022-7-2 10:45 | 只看該作者
xiaoyuxinke 發(fā)表于 2022-6-30 21:24
你只是定義一個(gè)變量的東東,這個(gè)變量定義不能用8位變量,不然只能小于255,也可以用unsigned int 定義一個(gè)變量

我的意思啊PICC編譯器,浮點(diǎn)數(shù)和16位數(shù)據(jù)運(yùn)算都不會(huì)出錯(cuò),比較數(shù)據(jù)8位(char)就正常,16位(int)就出錯(cuò)。
回復(fù)

使用道具 舉報(bào)

13#
ID:887371 發(fā)表于 2022-7-2 10:54 | 只看該作者
hym8085hym 發(fā)表于 2022-7-2 10:39
我發(fā)現(xiàn)PICC編譯器,運(yùn)算的數(shù)據(jù)是可以用16位或浮點(diǎn)數(shù),比較數(shù)據(jù)大小卻只能是8位,是這樣的嗎?我是新手。

有點(diǎn)煩了。
出現(xiàn)問題,竟然懷疑編譯器有問題,而不懷疑自己的代碼。
你這新手太牛逼了。
回復(fù)

使用道具 舉報(bào)

14#
ID:883242 發(fā)表于 2022-7-2 12:11 | 只看該作者
hym8085hym 發(fā)表于 2022-7-2 10:42
我的意思是我發(fā)現(xiàn)PICC編譯器,能運(yùn)算浮點(diǎn)數(shù)和16位數(shù)據(jù),比較數(shù)據(jù)卻只能8位。是不是設(shè)置有問題

1)你用的是什么單片機(jī)?
2)報(bào)錯(cuò)的內(nèi)容必須貼出來,一句“編譯不通過”無法給出足夠的信息。
3)最好把代碼貼出來。
回復(fù)

使用道具 舉報(bào)

15#
ID:769545 發(fā)表于 2022-7-2 13:40 | 只看該作者
datouyuan 發(fā)表于 2022-6-30 15:02
我用PICC9.83編譯你的代碼,二者都可以編譯通過,并且編譯結(jié)果(分析匯編代碼)是正確的。
用unsigned cha ...

很奇怪:pic16f884芯片就不會(huì)出錯(cuò);PIC16F676在中斷地方比較就會(huì)出錯(cuò),不在中斷地方比較就不會(huì)出錯(cuò)。
回復(fù)

使用道具 舉報(bào)

16#
ID:769545 發(fā)表于 2022-7-2 13:42 | 只看該作者
datouyuan 發(fā)表于 2022-7-2 10:54
有點(diǎn)煩了。
出現(xiàn)問題,竟然懷疑編譯器有問題,而不懷疑自己的代碼。
你這新手太牛逼了。

用PIC16F884芯片就可以通過;用PIC16F676芯片在中斷的地方比較就會(huì)出錯(cuò),正常的程序里面不會(huì)出錯(cuò)!奇怪的是這個(gè)
回復(fù)

使用道具 舉報(bào)

17#
ID:883242 發(fā)表于 2022-7-2 14:49 | 只看該作者
PIC16F676只有64bytes RAM,哪里經(jīng)得起你這么瞎折騰?
回復(fù)

使用道具 舉報(bào)

18#
ID:401564 發(fā)表于 2022-7-2 15:56 | 只看該作者
PIC16F676只有64個(gè)字節(jié)的RAM,比傳統(tǒng)8051的128個(gè)字節(jié)還少
而且,PIC16F676只有8級(jí)的硬件堆棧,不知道你對(duì)硬件堆棧了解與否?
如果不了解,那就告訴你幾個(gè)要注意的點(diǎn)
1,函數(shù)可以多,但盡量少在函數(shù)中調(diào)用函數(shù),而你調(diào)用的函數(shù)中又有調(diào)用其它函數(shù)的情況
2,中斷函數(shù)只做一些必需要做的操作,只要能在主函數(shù)做的事情,不要在中斷中進(jìn)行,中斷函數(shù)只做清除中斷標(biāo)志位,或者置位某個(gè)標(biāo)志,用于告訴主程序:這個(gè)中斷被觸發(fā)了
我沒有認(rèn)真看這個(gè)單片機(jī)的數(shù)據(jù)手冊(cè),不知道有沒有堆棧滿復(fù)位功能,如果有,那就使能這個(gè)功能,你程序運(yùn)行后不斷復(fù)位的,就說明你的代碼不行
回復(fù)

使用道具 舉報(bào)

19#
ID:769545 發(fā)表于 2022-7-7 10:19 | 只看該作者
Y_G_G 發(fā)表于 2022-7-2 15:56
PIC16F676只有64個(gè)字節(jié)的RAM,比傳統(tǒng)8051的128個(gè)字節(jié)還少
而且,PIC16F676只有8級(jí)的硬件堆棧,不知道你對(duì)硬件 ...

我之前是用匯編的。想學(xué)習(xí)C語言,實(shí)際上這個(gè)程序我定義的RAM不多,提示是不夠用。就是不明白C語言的程序是怎么影響到RAM.按理定義是不影響RAM數(shù)量的呀
回復(fù)

使用道具 舉報(bào)

20#
ID:879348 發(fā)表于 2022-7-7 10:38 | 只看該作者
PIC應(yīng)該不會(huì),只有一些低端單片機(jī)才會(huì)使用精簡(jiǎn)C
回復(fù)

使用道具 舉報(bào)

21#
ID:401564 發(fā)表于 2022-7-7 10:40 | 只看該作者
hym8085hym 發(fā)表于 2022-7-7 10:19
我之前是用匯編的。想學(xué)習(xí)C語言,實(shí)際上這個(gè)程序我定義的RAM不多,提示是不夠用。就是不明白C語言的程序 ...

你用匯編,就更應(yīng)該知道RAM和堆棧了,特別是PIC這種使用硬件堆棧的單片機(jī)
8級(jí)硬件堆棧在匯編上還行,但到了C,函數(shù)調(diào)用得多了就不知道到底用了幾層了,很容易就溢出了
RAM更不用說了,像STC的8051一般都有擴(kuò)展的SRAM,大多情況下還是夠用的
PIC16F676就真真的只有64個(gè)字節(jié)了,沒用過這個(gè)單片機(jī),實(shí)在不了解64個(gè)字節(jié)的RAM到底能干多少活
回復(fù)

使用道具 舉報(bào)

22#
ID:887371 發(fā)表于 2022-7-7 10:43 | 只看該作者
hym8085hym 發(fā)表于 2022-7-7 10:19
我之前是用匯編的。想學(xué)習(xí)C語言,實(shí)際上這個(gè)程序我定義的RAM不多,提示是不夠用。就是不明白C語言的程序 ...
這代碼太多問題了。
1.不要大量使用volatile 絕對(duì)定位變量。
2.能用自動(dòng)變量就不要用全局變量。
3.中斷服務(wù)中使用函數(shù)。
4.多處代碼邏輯混亂。
5.picc的特有語法使用錯(cuò)誤。你這代碼功能我猜測(cè)是2位數(shù)碼管顯示,只需要標(biāo)準(zhǔn)C語言就能完成,完全不需要用到picc的特有語法。雖然你沒定義幾個(gè)變量,因語法出錯(cuò),編譯提示定義的變量超出了極限。

樓主應(yīng)要花幾天學(xué)習(xí)下C語言基礎(chǔ)。


你在另一個(gè)帖子里有完整代碼,錯(cuò)誤太多。

按理定義是不影響RAM數(shù)量,但你錯(cuò)誤的代碼會(huì)。
回復(fù)

使用道具 舉報(bào)

23#
ID:769545 發(fā)表于 2022-7-7 11:07 | 只看該作者
Y_G_G 發(fā)表于 2022-7-7 10:40
你用匯編,就更應(yīng)該知道RAM和堆棧了,特別是PIC這種使用硬件堆棧的單片機(jī)
8級(jí)硬件堆棧在匯編上還行,但到了 ...

之前用匯編,所以內(nèi)存我控制的很嚴(yán)格;中斷里面用到的RAM是不能被優(yōu)化,所以需要固定地址;我發(fā)現(xiàn)又奇怪的是:固定地址編譯能通過,如果沒固定地址,就提示內(nèi)存不夠,程序都一樣的。以下的定義都是用在中斷里面的;
能通過的定義:
unsigned char volatile LSEC @ 0X24;
unsigned char volatile HSEC @ 0X25;
unsigned char volatile DIP0 @ 0X26;
unsigned char volatile DIP1 @ 0X27;
unsigned char volatile WEI @ 0X30;
如果以下定義:
unsigned char volatile LSEC ;
unsigned char volatile HSEC ;
unsigned char volatile DIP0 @ 0X26;
unsigned char volatile DIP1 @ 0X27;
unsigned char volatile WEI @ 0X30;
就提示出錯(cuò):could not find space (1 byte) for variable _HSEC
回復(fù)

使用道具 舉報(bào)

24#
ID:401564 發(fā)表于 2022-7-7 12:00 | 只看該作者
hym8085hym 發(fā)表于 2022-7-7 11:07
之前用匯編,所以內(nèi)存我控制的很嚴(yán)格;中斷里面用到的RAM是不能被優(yōu)化,所以需要固定地址;我發(fā)現(xiàn)又奇怪 ...

我用的是XC8編譯器,沒有用過PICC
這個(gè)單片機(jī)只有8級(jí)硬件堆棧,中斷的話,PC程序計(jì)數(shù)器用兩個(gè),那就只剩下6級(jí)堆棧了
在中斷中基本就不能再使用其它函數(shù)了,只能做清除標(biāo)志位之類的操作了
至于,volatile變量,沒有那個(gè)必要,這種事情留給編譯器去做,你沒有充分理解硬件和代碼如何執(zhí)行的情況下,盲目的用volatile,只會(huì)弄巧成拙
回復(fù)

使用道具 舉報(bào)

25#
ID:769545 發(fā)表于 2022-7-7 12:30 | 只看該作者
Y_G_G 發(fā)表于 2022-7-7 12:00
我用的是XC8編譯器,沒有用過PICC
這個(gè)單片機(jī)只有8級(jí)硬件堆棧,中斷的話,PC程序計(jì)數(shù)器用兩個(gè),那就只剩下6 ...

我后續(xù)用你的編譯器試試。謝謝您的回復(fù)。
回復(fù)

使用道具 舉報(bào)

26#
ID:121859 發(fā)表于 2022-7-7 13:30 | 只看該作者
if(YEAR>=2020)是沒有問題的,問題可能出在你的ADCY這個(gè)位變量上。
回復(fù)

使用道具 舉報(bào)

27#
ID:401564 發(fā)表于 2022-7-7 20:04 | 只看該作者
hym8085hym 發(fā)表于 2022-7-7 12:30
我后續(xù)用你的編譯器試試。謝謝您的回復(fù)。

沒叫你用XC8呀
我只是我說不沒有用過PICC而已
我用XC8是因?yàn)橘I的書上面用的是XC8,所以,就跟著學(xué)了
你要學(xué)的是C語言方面編程
你倒是可以看一下CCS編譯器,這個(gè)函數(shù)就很多了,像什么PWM,延時(shí),讀寫SD卡都有的
回復(fù)

使用道具 舉報(bào)

28#
ID:887371 發(fā)表于 2022-7-8 10:49 | 只看該作者
hym8085hym 發(fā)表于 2022-7-7 12:30
我后續(xù)用你的編譯器試試。謝謝您的回復(fù)。

樓主還是在懷疑編譯器。
都已經(jīng)多次指出是樓主代碼問題,和編譯器無關(guān)。

另外樓主懂匯編,應(yīng)該對(duì)比分析編譯出來的匯編代碼,也可以優(yōu)化自己的C代碼。
回復(fù)

使用道具 舉報(bào)

29#
ID:962286 發(fā)表于 2022-7-9 10:15 | 只看該作者
hym8085hym 發(fā)表于 2022-7-7 11:07
之前用匯編,所以內(nèi)存我控制的很嚴(yán)格;中斷里面用到的RAM是不能被優(yōu)化,所以需要固定地址;我發(fā)現(xiàn)又奇怪 ...

你把volatile修飾和強(qiáng)制@地址去掉,讓編譯器自由分配地址,估計(jì)就好了。

另外:新手不要輕易懷疑編譯器問題,尤其是一個(gè)經(jīng)過十多年考驗(yàn)的已經(jīng)相當(dāng)成熟的編譯器。多從自己身上找問題,可以減少不必要的時(shí)間浪費(fèi)。
回復(fù)

使用道具 舉報(bào)

30#
ID:769545 發(fā)表于 2022-7-9 10:48 | 只看該作者
datouyuan 發(fā)表于 2022-7-8 10:49
樓主還是在懷疑編譯器。
都已經(jīng)多次指出是樓主代碼問題,和編譯器無關(guān)。

奇怪的是:和匯編一樣固定地址就編譯沒問題,編譯提示內(nèi)存用的不多。不固定地址編譯就提示內(nèi)存不夠;想不明白啊
回復(fù)

使用道具 舉報(bào)

31#
ID:1038923 發(fā)表于 2022-7-9 11:20 | 只看該作者
定義的unsighed int 最大就是255吧,你超過了當(dāng)然要出錯(cuò)了。如果擔(dān)心這個(gè)問題直接定義Long int
回復(fù)

使用道具 舉報(bào)

32#
ID:883242 發(fā)表于 2022-7-9 13:48 | 只看該作者
liu1337 發(fā)表于 2022-7-9 11:20
定義的unsighed int 最大就是255吧,你超過了當(dāng)然要出錯(cuò)了。如果擔(dān)心這個(gè)問題直接定義Long int

懂就回答不懂就算了,你的回復(fù)錯(cuò)漏連篇就沒有對(duì)的地方。

8樓已經(jīng)貼出來unsigned int是16位,最大是65535。

c語言的優(yōu)點(diǎn)是你就算是超過范圍也不可能在編譯階段報(bào)錯(cuò),樓主的問題你再看一遍。
回復(fù)

使用道具 舉報(bào)

33#
ID:401564 發(fā)表于 2022-7-9 19:02 | 只看該作者
這只是一個(gè)很簡(jiǎn)單的問題呀,為什么就折騰了十來天呢?
就那么幾十行代碼,只要這穿牛角尖,幾天就能解決問題
1,不要在中斷中有函數(shù),中斷只做中斷標(biāo)志位的清除
2,不要給變量自己加上volatile,標(biāo)準(zhǔn)C寫就行
3,能用局部變量就不要用全局變量,全局變量在整個(gè)程序運(yùn)行中是一直占用RAM的,局部變量就不一樣了
回復(fù)

使用道具 舉報(bào)

34#
ID:950946 發(fā)表于 2022-7-9 23:54 | 只看該作者
本帖最后由 dwb123 于 2022-7-10 16:50 編輯

0-255是8位寬,256就不是了
回復(fù)

使用道具 舉報(bào)

35#
ID:950946 發(fā)表于 2022-7-9 23:57 | 只看該作者
0-255是8位大于255不就是9位了
回復(fù)

使用道具 舉報(bào)

36#
ID:1037510 發(fā)表于 2022-7-12 11:40 | 只看該作者
255 的二進(jìn)制是1111 1111 ,再加1是啥?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表