2014-06-28 55 views
1

例如,給定的定義在https://developer.gnome.org/glib/stable/glib-Basic-Types.html位大小更奇特(認爲16位字符)平臺

gint8

typedef signed char gint8;

帶符號的整數保證在所有平臺上都是8位。的 這種類型的取值範圍爲G_MININT8(= -128)到G_MAXINT8(= 127)

- 這是什麼巧舌如簧做保證仍然對平臺,其中char是不是8位8位的類型?或僅僅是GLib x86 /等(即這是一個已知的限制)?

+0

「char」不是* 8位但今天仍在使用的平臺的數量可能很容易用一隻手計數。但是你應該尋找更多的上下文,比如定義周圍的'#ifdef'。 –

+4

它只是通過不支持這樣一個平臺。 –

+0

如果這樣一個平臺仍然存在並且值得支持glib,那麼很可能僅僅依靠編譯器來提供一個適合平臺轉換的8位類型。有點類似於64位整數如何在32位cpus上工作。 – jtaylor

回答

2

正如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的範圍。

+0

耶!非常感謝! :) – mlvljr

2

gint8(連同其他平臺相關類型)在glibconfig.h中聲明,通常安裝在/usr/lib/glib-2.0/include之下。

該文件在configure time生成,所以至少在理論上gint8可以是不同的東西。