為什麼c51程式設計多用unsigned char int

時間 2021-05-05 18:16:40

1樓:sinoshen

因為51晶元最大的用途是做控制,而不是做運算。

以51的指令集來做運算,那效率,嘖嘖。

人家指令集架構一條指令,乙個cycle能完成乘加運算,8051要多少指令。

所以歸根結底,人家提供的例程就沒太多考慮複雜運算的事。

你要問能不能搞有符號運算,那當然可以,人家編譯器調個lib分分鐘給你搞定。至於要佔多少RAM,多少ROM,執行時間多少,你只能自己看著辦嘍。

2樓:luogu

第二就是,嵌入式程式設計尤其是51這類8位的MCU一般很少會用負數,甚至浮點都會設法轉換成整數來計算,自然是unsigned經濟實惠了

你若是資源也能給我按GB算,我才不管那些char int 我全部double都不慫

3樓:朱涵俊

不光是c51,跟裸機打交道的作業系統,嵌入式系統都用unsinged的多,帶符號的一般就在返回碼,或者迴圈變數上。

一是裸機系統要跟位址打交道,而位址是無符號的,c語言各種unsigned 跟指標轉換的。

二是無符號數計算理解上「可控」,比如-1>>1,隨便乙個程式設計師都能算出來是多少,但是如果是有符號數,大部分程式設計師不知道結果。

4樓:善計者不以籌

還有乙個原因,就是我們寫51程式時乙個u8型別往往並不用來表示數量,而是用來做乙個位元組的資料使用。

我們往往是要用u8來存乙個'\n',或者乙個0x0a之類的,它並不是表示數量,而是僅僅是用來存乙個位元組的資料,這時候如果用signed char有時候會帶來想不到的東西。

但是你問我帶來什麼,我確實沒想到,但是我覺得可能會有bug,hhh

分割線unsigned是因為可以擴大表示正整數的範圍,畢竟乙個char只有0~128,常常不夠用,256的話就比較穩,反正負數又往往用不到。

順便說一句,資料溢位真的有時候會導致奇怪的bug,unsigned和signed來回串有時候也會出問題,warning有時候還是要看一看。

51微控制器效能太弱了,而且是個8位微控制器,所以char型別由於也是8位,天然的就比較適合51。因為51的指令運算元就是8位,所以編譯以後數不需要拆分高低位元組,速度可能要快一點。而且51的ram和rom都太小了,能用8位解決還是希望避免16和32。

而在資源相對豐富的32位的stm32上寫程式時就很少出現這種情況,而且很少用8位的char,因為喪失了之前的優點,而且又常常因為溢位導致奇怪的問題。

5樓:Co Yuan

這體現了嵌農和碼農的價值觀區別。嵌農會精心計算乙個變數的範圍,而碼農很少這麼做,因為碼農預設的數值型別一般是int32,可以滿足日常範圍需求,甚至像Python那樣的語言自帶大整數特性,根本不用考慮範圍。然而嵌農呢,尤其是你說的c51,是個Intel祖傳8位機,本來ram就很少,當然要精心考慮變數的大小了。

像int32這樣的東西太奢侈了,只能精打細算,根據現實情況精選乙個範圍合適的型別。鑑於大部分情況並不需要負數,所以用unsigned型別能提高0以上的數值範圍。另外需要指出的是很多c51編譯器裡int型別是16位的。

所以嵌農的悲傷就在這裡,別人已經開始寫演算法了,你還在研究這個變數存不存得下的問題。

為什麼C 遍歷多用 ,Java遍歷多用

張強 即使是C C 我也習慣用 因為你並不能確保你的迴圈體內不會存在改變i的操作,一旦改變i的資料,導致迴圈跳過了i 5的這個迴圈,那麼這個迴圈會成為死迴圈,所以我認為除非有特定用途,迴圈條件裡面最好使用乙個範圍而不是某乙個值 這裡用不等號是受迭代器遍歷寫法的影響。因為不是所有迭代器都支援用 號做比...

80C51的定址方式中,為什麼立即定址對應的定址空間是ROM?

柯小西 我覺得是因為,立即定址的操作碼後面直接跟隨的就是立即數,也就是說,立即數和指令一起都是放在程式區的,所以,所涉及的定址空間就是ROM! 你這個問題問錯了吧。8051的內部memory空間可以分為 64K ROM空間 64K外部DATA空間 128B或者256B內部DATA空間 128B內部S...

大學程式設計入門為什麼不以C 作為首選?

李杭帆 可能是太難了吧。C 指標鍊錶什麼的,當年難倒了一堆同學。using System using System.Runtime.InteropServices namespace ThisAssembly public static unsafe void Free T ptr whereT u...