21

C标准规定:

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

char、signed char 和 unsigned char 这三种类型统称为字符类型。实现应将 char 定义为与有符号字符或无符号字符具有相同的范围、表示和行为。

确实gcc根据目标平台定义了它。

我的问题是,为什么标准会这样做?除了可怕且难以发现的错误之外,我看不到任何来自模棱两可的类型定义的东西。

不仅如此,在 ANSI C(C99 之前)中,唯一的字节大小类型是 char,因此有时不可避免地使用 char 进行数学运算。所以说“一个人永远不应该使用 char 进行数学运算”并不是那么正确。如果是这样的话,更明智的决定是包括三种类型“ char, ubyte, sbyte”。

这是有原因的,还是只是一些奇怪的向后兼容问题,以便允许将糟糕的(但常见的)编译器定义为标准兼容?

4

5 回答 5

26

具有未指定符号的“普通”字符允许编译器选择对目标体系结构更有效的表示:在某些体系结构上,零将一个字节值扩展到“int”的大小需要更少的操作(因此使普通 char ' unsigned'),而在其他指令集使符号扩展更加自然,并且普通字符被实现为有符号。

于 2009-05-27T06:43:40.187 回答
12

也许从历史上看,一些实现的“char”是有符号的,有些是无符号的,因此为了与两者兼容,他们不能将其定义为一个或另一个。

于 2009-05-27T06:42:09.050 回答
6

在那些美好的过去 C 被定义时,字符世界是 7 位的,所以符号位可以用于其他事情(如 EOF)

于 2009-05-27T08:03:29.890 回答
1

在某些机器上,有符号字符太小,无法容纳 C 字符集中的所有字符(字母、数字、标准标点符号等)。在此类机器上,'char' 必须是无符号的。在其他机器上,unsigned char 可以保存比有符号 int 更大的值(因为 char 和 int 大小相同)。在那些机器上,'char' 必须被签名。

于 2010-12-08T04:31:38.157 回答
0

我想(不由自主地)他们的想法是这样的:

如果您关心 char 的符号(将其用作字节),则应明确选择有符号或无符号字符。

于 2009-05-27T06:32:17.723 回答