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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5845|回復: 35
打印 上一主題 下一主題
收起左側

請問C語言比較數YEAR為什么不能大于255,大于會出錯(之前的舉例程序有問題)

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

for(;;)
{

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

}


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

使用道具 舉報

沙發
ID:887371 發表于 2022-6-30 15:02 | 只看該作者
我用PICC9.83編譯你的代碼,二者都可以編譯通過,并且編譯結果(分析匯編代碼)是正確的。
用unsigned char會有警告。警告信息如下:
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


通常編譯器是不會有問題的,你應該檢查你的代碼。
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

PICC中short是16位。


回復

使用道具 舉報

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

使用道具 舉報

10#
ID:769545 發表于 2022-7-2 10:39 | 只看該作者

我發現PICC編譯器,運算的數據是可以用16位或浮點數,比較數據大小卻只能是8位,是這樣的嗎?我是新手。
回復

使用道具 舉報

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

我的意思是我發現PICC編譯器,能運算浮點數和16位數據,比較數據卻只能8位。是不是設置有問題
回復

使用道具 舉報

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

我的意思啊PICC編譯器,浮點數和16位數據運算都不會出錯,比較數據8位(char)就正常,16位(int)就出錯。
回復

使用道具 舉報

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

有點煩了。
出現問題,竟然懷疑編譯器有問題,而不懷疑自己的代碼。
你這新手太牛逼了。
回復

使用道具 舉報

14#
ID:883242 發表于 2022-7-2 12:11 | 只看該作者
hym8085hym 發表于 2022-7-2 10:42
我的意思是我發現PICC編譯器,能運算浮點數和16位數據,比較數據卻只能8位。是不是設置有問題

1)你用的是什么單片機?
2)報錯的內容必須貼出來,一句“編譯不通過”無法給出足夠的信息。
3)最好把代碼貼出來。
回復

使用道具 舉報

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

很奇怪:pic16f884芯片就不會出錯;PIC16F676在中斷地方比較就會出錯,不在中斷地方比較就不會出錯。
回復

使用道具 舉報

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

用PIC16F884芯片就可以通過;用PIC16F676芯片在中斷的地方比較就會出錯,正常的程序里面不會出錯!奇怪的是這個
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

19#
ID:769545 發表于 2022-7-7 10:19 | 只看該作者
Y_G_G 發表于 2022-7-2 15:56
PIC16F676只有64個字節的RAM,比傳統8051的128個字節還少
而且,PIC16F676只有8級的硬件堆棧,不知道你對硬件 ...

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

使用道具 舉報

20#
ID:879348 發表于 2022-7-7 10:38 | 只看該作者
PIC應該不會,只有一些低端單片機才會使用精簡C
回復

使用道具 舉報

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

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

使用道具 舉報

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

樓主應要花幾天學習下C語言基礎。


你在另一個帖子里有完整代碼,錯誤太多。

按理定義是不影響RAM數量,但你錯誤的代碼會。
回復

使用道具 舉報

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

之前用匯編,所以內存我控制的很嚴格;中斷里面用到的RAM是不能被優化,所以需要固定地址;我發現又奇怪的是:固定地址編譯能通過,如果沒固定地址,就提示內存不夠,程序都一樣的。以下的定義都是用在中斷里面的;
能通過的定義:
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;
就提示出錯:could not find space (1 byte) for variable _HSEC
回復

使用道具 舉報

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

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

使用道具 舉報

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

我后續用你的編譯器試試。謝謝您的回復。
回復

使用道具 舉報

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

使用道具 舉報

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

沒叫你用XC8呀
我只是我說不沒有用過PICC而已
我用XC8是因為買的書上面用的是XC8,所以,就跟著學了
你要學的是C語言方面編程
你倒是可以看一下CCS編譯器,這個函數就很多了,像什么PWM,延時,讀寫SD卡都有的
回復

使用道具 舉報

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

樓主還是在懷疑編譯器。
都已經多次指出是樓主代碼問題,和編譯器無關。

另外樓主懂匯編,應該對比分析編譯出來的匯編代碼,也可以優化自己的C代碼。
回復

使用道具 舉報

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

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

另外:新手不要輕易懷疑編譯器問題,尤其是一個經過十多年考驗的已經相當成熟的編譯器。多從自己身上找問題,可以減少不必要的時間浪費。
回復

使用道具 舉報

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

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

使用道具 舉報

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

使用道具 舉報

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

懂就回答不懂就算了,你的回復錯漏連篇就沒有對的地方。

8樓已經貼出來unsigned int是16位,最大是65535。

c語言的優點是你就算是超過范圍也不可能在編譯階段報錯,樓主的問題你再看一遍。
回復

使用道具 舉報

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

使用道具 舉報

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

0-255是8位寬,256就不是了
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 粉嫩av久久一区二区三区 | 国产91视频免费 | 男人阁久久 | 成人3d动漫一区二区三区91 | 亚洲精品视频在线播放 | 黄色av大片 | 日韩中文字幕一区二区三区 | 老司机狠狠爱 | 午夜网站视频 | 欧美激情一区二区三区 | 在线观看亚洲专区 | 成人二区| 欧美国产一区二区 | 日本三级日产三级国产三级 | 中文字幕二区三区 | 久久99精品久久久水蜜桃 | 国产资源在线视频 | 91精品国产乱码久久久久久 | 国产精彩视频一区 | 国产视频不卡一区 | 午夜影院操 | 夜夜骚 | 日韩和的一区二区 | 久久另类 | 亚洲久久久 | 国产99精品 | 亚洲精品一二三 | 日本aⅴ中文字幕 | 欧美日韩国产一区二区三区不卡 | 精品亚洲永久免费精品 | 观看av| 成人一区二区三区在线观看 | 在线免费观看黄色 | 国产91视频一区二区 | 国产精品成人久久久久 | 黑人巨大精品 | 国产一区二区在线看 | 在线亚洲电影 | 在线一区二区三区 | 欧美一级α片 | 国产日韩欧美 |