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

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

作者: hym8085hym    時間: 2022-6-30 12:50
標題: 請問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編譯

作者: datouyuan    時間: 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


通常編譯器是不會有問題的,你應該檢查你的代碼。
作者: Y_G_G    時間: 2022-6-30 17:10
我這只有XC8的,但樓上已經幫你測試過了,并沒有問題,那就像他說的那樣,檢查一下你自己的代碼
試想一下你也能明白這個道理的,再垃圾的編譯器,它也不會到連一個16位數大小都不能比較的地步吧,那三角函數,浮點運算怎么辦呢?
作者: Hephaestus    時間: 2022-6-30 21:15
出什么錯都不貼出來,讓大家盲猜?
作者: xiaoyuxinke    時間: 2022-6-30 21:24
你只是定義一個變量的東東,這個變量定義不能用8位變量,不然只能小于255,也可以用unsigned int 定義一個變量
作者: glinfei    時間: 2022-7-1 09:48
我沒有試過,但如果unsigned short 通過不了,我會用 unsigned int 替代的,畢竟給單片機的編譯器嘛。
作者: zjswuyunbo    時間: 2022-7-1 10:11
sizeof(unsignd short),看一下這個類型是不是16位
作者: datouyuan    時間: 2022-7-1 11:35
zjswuyunbo 發表于 2022-7-1 10:11
sizeof(unsignd short),看一下這個類型是不是16位

PICC中short是16位。



作者: 17337161031    時間: 2022-7-1 19:35
數據是8位的
作者: hym8085hym    時間: 2022-7-2 10:39
17337161031 發表于 2022-7-1 19:35
數據是8位的

我發現PICC編譯器,運算的數據是可以用16位或浮點數,比較數據大小卻只能是8位,是這樣的嗎?我是新手。
作者: hym8085hym    時間: 2022-7-2 10:42
datouyuan 發表于 2022-6-30 15:02
我用PICC9.83編譯你的代碼,二者都可以編譯通過,并且編譯結果(分析匯編代碼)是正確的。
用unsigned cha ...

我的意思是我發現PICC編譯器,能運算浮點數和16位數據,比較數據卻只能8位。是不是設置有問題
作者: hym8085hym    時間: 2022-7-2 10:45
xiaoyuxinke 發表于 2022-6-30 21:24
你只是定義一個變量的東東,這個變量定義不能用8位變量,不然只能小于255,也可以用unsigned int 定義一個變量

我的意思啊PICC編譯器,浮點數和16位數據運算都不會出錯,比較數據8位(char)就正常,16位(int)就出錯。
作者: datouyuan    時間: 2022-7-2 10:54
hym8085hym 發表于 2022-7-2 10:39
我發現PICC編譯器,運算的數據是可以用16位或浮點數,比較數據大小卻只能是8位,是這樣的嗎?我是新手。

有點煩了。
出現問題,竟然懷疑編譯器有問題,而不懷疑自己的代碼。
你這新手太牛逼了。
作者: Hephaestus    時間: 2022-7-2 12:11
hym8085hym 發表于 2022-7-2 10:42
我的意思是我發現PICC編譯器,能運算浮點數和16位數據,比較數據卻只能8位。是不是設置有問題

1)你用的是什么單片機?
2)報錯的內容必須貼出來,一句“編譯不通過”無法給出足夠的信息。
3)最好把代碼貼出來。
作者: hym8085hym    時間: 2022-7-2 13:40
datouyuan 發表于 2022-6-30 15:02
我用PICC9.83編譯你的代碼,二者都可以編譯通過,并且編譯結果(分析匯編代碼)是正確的。
用unsigned cha ...

很奇怪:pic16f884芯片就不會出錯;PIC16F676在中斷地方比較就會出錯,不在中斷地方比較就不會出錯。
作者: hym8085hym    時間: 2022-7-2 13:42
datouyuan 發表于 2022-7-2 10:54
有點煩了。
出現問題,竟然懷疑編譯器有問題,而不懷疑自己的代碼。
你這新手太牛逼了。

用PIC16F884芯片就可以通過;用PIC16F676芯片在中斷的地方比較就會出錯,正常的程序里面不會出錯!奇怪的是這個
作者: Hephaestus    時間: 2022-7-2 14:49
PIC16F676只有64bytes RAM,哪里經得起你這么瞎折騰?
作者: Y_G_G    時間: 2022-7-2 15:56
PIC16F676只有64個字節的RAM,比傳統8051的128個字節還少
而且,PIC16F676只有8級的硬件堆棧,不知道你對硬件堆棧了解與否?
如果不了解,那就告訴你幾個要注意的點
1,函數可以多,但盡量少在函數中調用函數,而你調用的函數中又有調用其它函數的情況
2,中斷函數只做一些必需要做的操作,只要能在主函數做的事情,不要在中斷中進行,中斷函數只做清除中斷標志位,或者置位某個標志,用于告訴主程序:這個中斷被觸發了
我沒有認真看這個單片機的數據手冊,不知道有沒有堆棧滿復位功能,如果有,那就使能這個功能,你程序運行后不斷復位的,就說明你的代碼不行
作者: hym8085hym    時間: 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數量的呀
作者: wufa1986    時間: 2022-7-7 10:38
PIC應該不會,只有一些低端單片機才會使用精簡C
作者: Y_G_G    時間: 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到底能干多少活
作者: datouyuan    時間: 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數量,但你錯誤的代碼會。

作者: hym8085hym    時間: 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
作者: Y_G_G    時間: 2022-7-7 12:00
hym8085hym 發表于 2022-7-7 11:07
之前用匯編,所以內存我控制的很嚴格;中斷里面用到的RAM是不能被優化,所以需要固定地址;我發現又奇怪 ...

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

我后續用你的編譯器試試。謝謝您的回復。
作者: zhxiufan    時間: 2022-7-7 13:30
if(YEAR>=2020)是沒有問題的,問題可能出在你的ADCY這個位變量上。
作者: Y_G_G    時間: 2022-7-7 20:04
hym8085hym 發表于 2022-7-7 12:30
我后續用你的編譯器試試。謝謝您的回復。

沒叫你用XC8呀
我只是我說不沒有用過PICC而已
我用XC8是因為買的書上面用的是XC8,所以,就跟著學了
你要學的是C語言方面編程
你倒是可以看一下CCS編譯器,這個函數就很多了,像什么PWM,延時,讀寫SD卡都有的
作者: datouyuan    時間: 2022-7-8 10:49
hym8085hym 發表于 2022-7-7 12:30
我后續用你的編譯器試試。謝謝您的回復。

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

另外樓主懂匯編,應該對比分析編譯出來的匯編代碼,也可以優化自己的C代碼。
作者: MCU_FANS    時間: 2022-7-9 10:15
hym8085hym 發表于 2022-7-7 11:07
之前用匯編,所以內存我控制的很嚴格;中斷里面用到的RAM是不能被優化,所以需要固定地址;我發現又奇怪 ...

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

另外:新手不要輕易懷疑編譯器問題,尤其是一個經過十多年考驗的已經相當成熟的編譯器。多從自己身上找問題,可以減少不必要的時間浪費。
作者: hym8085hym    時間: 2022-7-9 10:48
datouyuan 發表于 2022-7-8 10:49
樓主還是在懷疑編譯器。
都已經多次指出是樓主代碼問題,和編譯器無關。

奇怪的是:和匯編一樣固定地址就編譯沒問題,編譯提示內存用的不多。不固定地址編譯就提示內存不夠;想不明白啊
作者: liu1337    時間: 2022-7-9 11:20
定義的unsighed int 最大就是255吧,你超過了當然要出錯了。如果擔心這個問題直接定義Long int

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

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

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

c語言的優點是你就算是超過范圍也不可能在編譯階段報錯,樓主的問題你再看一遍。
作者: Y_G_G    時間: 2022-7-9 19:02
這只是一個很簡單的問題呀,為什么就折騰了十來天呢?
就那么幾十行代碼,只要這穿牛角尖,幾天就能解決問題
1,不要在中斷中有函數,中斷只做中斷標志位的清除
2,不要給變量自己加上volatile,標準C寫就行
3,能用局部變量就不要用全局變量,全局變量在整個程序運行中是一直占用RAM的,局部變量就不一樣了
作者: dwb123    時間: 2022-7-9 23:54
本帖最后由 dwb123 于 2022-7-10 16:50 編輯

0-255是8位寬,256就不是了
作者: dwb123    時間: 2022-7-9 23:57
0-255是8位大于255不就是9位了
作者: 不一定會    時間: 2022-7-12 11:40
255 的二進制是1111 1111 ,再加1是啥?




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 国产一区二区影院 | 国产午夜精品一区二区三区四区 | 国产一区2区 | 日本大片在线播放 | 麻豆一区一区三区四区 | 久久久九九九九 | 欧美日韩在线一区二区 | 成人国产精品久久久 | 日本免费一区二区三区四区 | 日韩一区三区 | 中日韩欧美一级片 | 日韩精品一区二 | 久久精品黄色 | 国产美女精品视频 | 91精品久久久久久久久久 | 国产中文在线 | 蜜月aⅴ免费一区二区三区 99re在线视频 | 中文字幕精品一区久久久久 | 欧美三级久久久 | zzzwww在线看片免费 | 久久国产婷婷国产香蕉 | 龙珠z在线观看 | 国产精品一区二区无线 | 一区二区三区欧美大片 | 亚洲欧美在线观看 | 国产一区二区在线播放视频 | 欧美视频区| 欧美日韩在线国产 | 日韩综合在线 | 久草在线视频中文 | 精品国产欧美一区二区三区成人 | 亚洲人a | 亚洲自拍偷拍免费视频 | 精品美女视频在线观看免费软件 | 日本激情视频中文字幕 | 一区二区在线免费观看 | 国产乱一区二区三区视频 | 精品国产乱码久久久久久中文 | 日日av | 亚洲成人网在线 | av一级毛片|