2016-10-01 50 views
0

如果要編寫一個程序,並且我需要一個小於255的數字,那麼可以使用unsigned char作爲數字來使用,比如如果我需要一個數字來創建一個循環?是否有任何理由,包括堅持傳統和慣例,堅持用int和float等來聲明數字。只需要少量數字就可以使用類型無符號字符嗎?

例如,應該像這樣的代碼永遠不會被使用?或者在這種情況下使用無符號字符是一種好習慣,因爲它分配的內存少於短整型?

#include <stdio.h> 

typedef unsigned char short_loop; 

int main(int argc, char *argv[]) 
{ 
    short_loop i; 

    for(i = 0; i < 138; i++) 
     printf("StackOverflow Example Code\n"); 

    return 0; 
} 

我要求將來參考,並只使用上面的代碼來幫助說明。

+1

這實際上只是一個很好的做法,例如它是一個大數目的小數字。使用一個字符而不是一個int會使總內存幾乎爲零 – Natecat

+1

char是一個整數類型,爲什麼存儲一個數字沒有用?查看[this](/ questions/5069489/performance-of-built-types-char-vs-short-vs-int-vs-float-vs-double)來了解內置類型之間性能差異的討論。使用8位int實際上可能比使用更大的int要慢 – Tibrogargan

+0

是否有任何理由** not **堅持'int'?你的代碼工作正常,但你認爲你會從使用'unsigned char'而不是'int'獲得什麼?在大多數情況下,完全沒有關係,因爲現代編譯器只會爲您的特定系統做任何「最好」的事情。 – 4386427

回答

2

我不會這樣做。

如果您的程序正在處理大量值的數組,那麼使用char而不是int的數組的內存使用情況會有好處。

但是,對於單個循環的控制變量,出於多種原因,不太可能有太多的好處,並且潛在的性能受到影響。

比較i < 138將促進iint做比較之前,因爲138int類型。促銷(和下轉換)也可能發生在初始化和遞增i

int通常是主機上的「本機類型」 - 這通常意味着它是主機上的首選類型(例如,硬件提供在該類型上運行時針對性能進行了優化的寄存器)。其中,即使在循環中進行比較之前,使用某種技術來阻止unsigned charint的推廣,無論如何,int上的操作可能更有效。

因此,最後,您的方法可能會或可能不會提供性能優勢。唯一確定的方法是分析代碼....並且(或者其他)的好處將依賴於編譯器(例如,受優化方法影響)和主機依賴性(例如,與操作int

你的方法也使得代碼更難理解,因此難以正確理解。而且,如果其他程序員(或您)將來修改代碼,則可能會取消任何好處......例如,意外重新引入了意外的類型轉換。

1

用於PC - 不是很好的做法。 用於嵌入式設備 - 取決於。

如果確保它不會超過255,那麼確定你可以使用它,因爲它無論如何都被轉換爲int,但是在這個例子中內存差異不是很重要。

它違反了可讀性。


而正如其他人所說,你是不必要地混淆你的代碼。 隨着類型定義..給它醜陋的名字。已知 索引是int類型的。就這樣。

2

是的,使用unsigned char是好的。我不會使用short_loop typedef,但它只是無故混淆了代碼。

有些人會建議使用uint8_t強調意圖是一個小整數,而不是字符數據;即使uint8_t很可能是unsigned char的typedef。

理論上你可以使用typedef ,它應該表示「一個無符號整數類型,至少8位,並且可用類型的速度最快」,顯然,「最快」的解釋有點含糊。

+0

你推薦使用uint8_t嗎? – Malina

+0

@Malina我會親自使用'int',但這比任何引人注目的技術原因更多的是個人偏好。 –

+0

使用int以外的任何東西都不是很常規。並且'uint8_t'不保證存在。這種過早的優化(內存方面)會降低可讀性,並且如果文字增加到255以上,則需要進行修改。在很多程序中,定義爲避免幻數,並且在某些情況下允許定製,就好像我們想要打印我們的自己的時間字符串。它將不得不在循環中明確地轉換文字兩次(因此在BP系列中進行優化),這是爲了表現。但並不重要。就像保存3個字節一樣。 – Malina

相關問題