2009-05-27 169 views
20

C標準狀態:爲什麼char在C中沒有定義符號?

ISO/IEC 9899:1999,6.2.5.15(第49)

三種類型CHAR,符號的字符,和 無符號字符統稱 字符類型。 實現應該定義字符到 具有相同的範圍,表示形式, 和行爲爲signed char或 unsigned char。

確實gcc根據目標平臺定義。

我的問題是,爲什麼標準這樣做?我看不出任何可以從模糊的類型定義中得出的東西,除了可怕的和難以發現的錯誤之外。

此外,在ANSI C(C99之前)中,唯一的字節大小的類型是char,所以使用char作爲數學有時是不可避免的。所以說「一個人不應該用數學來表達」並不是那麼真實。如果是這樣的話,一個更明智的決定是包括三種類型「char,ubyte,sbyte」。

是否有原因,或者它只是一些奇怪的向後兼容性問題,爲了讓壞的(但常見的)編譯器被定義爲標準兼容?

+0

[任何需要將'char'作爲'unsigned'的編譯器?](http://stackoverflow.com/q/3728045/995714) – 2016-02-20 03:27:15

回答

26

具有未指定簽名的「Plain」字符允許編譯器爲目標體系結構選擇哪種表示方式更高效:在某些體系結構中,零擴展單字節值到「int」的大小需要較少的操作(因此使簡單字符'無符號'),而在其他人的指令集使得符號擴展更自然,並且簡單的字符被實現爲簽名。

在那些美好時光被定義的C
0

我想(從我的頭頂部的),他們的想法是大致如下:

如果你關心字符的符號(使用它作爲一個字節),你應該明確選擇符號或無符號焦炭。

+0

無符號後來;簽署比這更晚了很多。 – 2009-05-27 06:45:22

12

也許從歷史上看,某些實現的「char」被簽名並且一些是未簽名的,所以爲了與它們兼容,它們不能將它們定義爲一個或另一個。

+6

正確。在目前的世界上,每一個處理器都是x86,Power或者Sparc,在70年代它很難說明,有幾十個不同的處理器可用於不同的體系結構。從優雅簡單的8位DECs到怪獸炮轟36位巨獸。甚至連角色的大小都沒有達成一致 - XEROX機器使用6位字符集。 – 2009-05-27 08:10:34

+0

爲什麼機器會關心角色?有沒有CPU命令輸出字符?我在x86中不知道這樣的事情。 – 2009-05-27 09:49:55

6

,性格世界是7位,所以符號位可以用於其他的東西(如EOF)

0

在一些機器上,一個符號的字符是太小保存C字符集中的所有字符(字母,數字,標點符號等)在這些機器上,'char'必須是無符號的。在其他機器上,unsigned char可以保存大於signed int的值(因爲char和int的大小相同)。在這些機器上,必須簽名'char'。

相關問題