Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么C中没有定义字符的符号性?_C_Gcc_Standards_Char_Unsigned - Fatal编程技术网

为什么C中没有定义字符的符号性?

为什么C中没有定义字符的符号性?,c,gcc,standards,char,unsigned,C,Gcc,Standards,Char,Unsigned,C标准规定: ISO/IEC 9899:1999,6.2.5.15 p。49 这三种类型分别是char、signed char和 无符号字符统称为 字符类型。这个 实现应定义char到 具有相同的范围、表示形式, 和行为作为有符号字符或 无符号字符 并根据目标平台来定义 我的问题是,为什么标准会这样做?我看不到任何可以从模棱两可的类型定义中产生的东西,除了可怕和难以发现的bug 更重要的是,在C99之前的ANSIC中,唯一字节大小的类型是char,因此在数学中使用char有时是不可避免的。所以说

C标准规定:

ISO/IEC 9899:1999,6.2.5.15 p。49

这三种类型分别是char、signed char和 无符号字符统称为 字符类型。这个 实现应定义char到 具有相同的范围、表示形式, 和行为作为有符号字符或 无符号字符

并根据目标平台来定义

我的问题是,为什么标准会这样做?我看不到任何可以从模棱两可的类型定义中产生的东西,除了可怕和难以发现的bug

更重要的是,在C99之前的ANSIC中,唯一字节大小的类型是char,因此在数学中使用char有时是不可避免的。所以说永远不要在数学中使用字符是不正确的。如果是这样的话,一个更明智的决定是包括三种类型:char、ubyte、sbyte


这是有原因的吗,或者只是一些奇怪的向后兼容性问题,为了让糟糕但常见的编译器被定义为标准兼容的编译器?

我想他们的想法是这样的:


如果您关心字符的符号,将其用作字节,则应显式选择有符号字符或无符号字符。

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

具有未指定符号的纯字符允许编译器选择对目标体系结构更有效的表示形式:在某些体系结构上,零将一个字节的值扩展到int的大小需要更少的操作,从而使纯字符“unsigned”,而在其他指令集上,则使符号扩展更自然,纯字符实现为有符号

在那些定义C的好日子里,字符世界是7bit,因此符号位可以用于其他事情,如EOF

在某些机器上,有符号字符太小,无法容纳C字符集中的所有字符字母、数字、标准标点符号等。在这些机器上,“字符”必须是无符号的。在其他计算机上,由于char和int的大小相同,因此无符号char可以包含大于有符号int的值。在这些机器上,“char”必须签名。

Unsigned随后出现;签名比那晚了很多。是的,硬件提供的任何东西都应该直接用于语言,上面的粘性糖最少。那么为什么不为未签名/签名的短片重复同样的故事呢?它也应该扩展到int.@ElazarLeibovich这是一个有见地的评论,但更常见的情况是,通过缩短与int相同的大小(例如,两个16位)来完全回避这个问题,而不是将char与int相同大小,尽管这两个都是C标准允许的,并且都存在于野外。而char的有符号性似乎不像short的有符号性那样重要,这使得妥协看起来更容易接受。@ElazarLeibovich:见下面我的答案;字符集可能会强制char不带符号,或者char和int的相对范围可能会强制char带符号。正确。在当前的世界中,每个处理器要么是x86,要么是Power,要么是Sparc,这很难重新定义,在hte 70年代,有几十个处理器可以使用不同的体系结构。从优雅简洁的8位DEC到庞然大物burroughs 36位庞然大物。甚至一个字符的大小都没有达成一致意见——施乐机器使用的是6位字符集。为什么机器会关心字符?是否有CPU命令来输出字符?我在x86中不知道这样的事情。是的,原因是历史的。然后,因为我们有无符号字符/有符号字符/普通字符-出于对称性的原因,我们也有有符号int/short-即使其他整数类型的有符号字符是多余的。因此,主要是为了定义好符号性,但是对于char来说,这不能再发生了——太多的代码会被破坏。因为在某些体系结构上,无符号字符更有效,而在另一些体系结构上则相反