正如Hans Passant在他的評論中所說的,glib保證gint8
是8位不支持的平臺,其中signed char
是任何其他大小。只有兩種類型的系統有過C編譯器的實現,而這些需求沒有得到滿足。
第一個是字節大小爲9位的系統。今天這些已經過時了,但像這樣的系統有一些最早的C編譯器。它理論上可能是編譯器模擬一個受限範圍的8位類型作爲擴展,但它在內存中仍然是9位長,並且沒有真正爲你帶來什麼。
第二個是字可尋址系統,字大小是16,32或64位。在這些計算機中,處理器只能在字邊界處尋址內存。地址0是第一個字,地址1是第二個字,依此類推,字之間沒有任何重疊。對於大多數這樣的系統現在已經過時了,但沒有多達9位字節的機器。顯然在嵌入式系統中至少還有一些使用可尋址字處理器。
在針對字可尋址系統的C編譯器中,根據編譯器的不同,字節的大小不是字大小就是8位。一些編譯器給出了一個選擇。具有字節大小的字節是最簡單的方法。另一方面實現8位字節需要一點點工作。編譯器不僅需要使用多條指令來訪問每個字中包含的單獨8位值,還必須模擬一個字節可尋址指針。這通常意味着char
指針與int
指針的大小不同,因爲字節可尋址指針需要更多空間存儲地址和字節偏移量。
不用說glib支持使用字大小字節的編譯器,而使用8位字節的編譯器至少可以實現gint8
。雖然他們可能還會因爲其他一些原因而得不到支持。 sizeof(char *) > size(int *)
爲真的事實可能是一個問題。
我還應該指出,還有一些其他長期過時的系統,雖然使用8位字節的C編譯器仍然沒有滿足gint8
要求的類型。這些是使用補碼或有符號整數的系統,這意味着signed char
的範圍從-127到127,而不是由glib保證的-128到127的範圍。
「char」不是* 8位但今天仍在使用的平臺的數量可能很容易用一隻手計數。但是你應該尋找更多的上下文,比如定義周圍的'#ifdef'。 –
它只是通過不支持這樣一個平臺。 –
如果這樣一個平臺仍然存在並且值得支持glib,那麼很可能僅僅依靠編譯器來提供一個適合平臺轉換的8位類型。有點類似於64位整數如何在32位cpus上工作。 – jtaylor