为什么char的符号没有在C中定义?

Ela*_*ich 20 c standards unsigned gcc char

C标准规定:

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

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

确实gcc根据目标平台定义.

我的问题是,为什么标准会这样做?除了可怕的和难以发现的错误之外,我看不出任何可能来自模糊类型定义的内容.

更重要的是,在ANSI C(C99之前)中,唯一的字节大小类型是char,因此使用char进行数学运算有时是不可避免的.所以说"一个人永远不应该使用char来表示数学"并非如此.如果是这样的话,一个理智的决定是包括三种类型" ,".charubytesbyte

有没有理由,或者它只是一些奇怪的向后兼容性问题,以便将坏(但常见)编译器定义为标准兼容?

小智 26

具有未指定签名的"普通"字符允许编译器选择对目标体系结构更有效的表示:在某些体系结构上,将一个字节值扩展为"int"的大小需要更少的操作(从而使得简单的字符' unsigned'),而在其他指令集上,指令集使符号扩展更自然,而普通的char实现为signed.

  • 那么为什么不对未签名/签名的短片重复同样的故事呢?它也应该扩展到int. (9认同)

new*_*cct 12

也许从历史上看,某些实现的"char"已经签名,而且有些是未签名的,因此为了与它们兼容,它们无法将其定义为一个或另一个.

  • 正确.在当前的世界中,每个处理器都是x86,Power或Sparc,很难重新开发,在70年代,有数十种处理器可用于不同的架构.从8位DEC的优雅简约到怪物bur 36 36位庞然大物.甚至没有同意角色的大小 - XEROX机器工作在6位字符集. (6认同)

Pet*_*hle 6

在那些美好的旧时代C被定义,角色世界是7位,所以符号位可用于其他事物(如EOF)