在C中默认签名

Der*_*unk 14 c standards

再一次,我正在上课,在那里我可以回答学生关于C的问题.这里有一个我不知道的答案:是否有理由接受signed作为C的默认修饰符?人们会想到这unsigned是自然的选择.那么,这真的是一个设计决定吗?

pax*_*blo 15

标准而言(因为您的问题被标记signed为此标记),被标记为默认值,因为它与标准之前的C实现的方式相同.

最初的ANSI/ISO标准要求是编纂现有的实践,而不是创建一种新的语言.因此,根据基本原理文档,预标准实现的行为是最重要的因素:

最初的X3J11章程明确要求编纂共同的现行做法,而C89委员会在任何明确和明确的地方都坚持先例.

C89定义的绝大多数语言与Brian Kernighan和Dennis Ritchie在C语言编程语言第一版的附录A中所定义的完全相同,并且在当时几乎所有C语言翻译器中都实现了.(以下将该文件称为K&R.)

如果您正在寻找预标准实现首选的原因signed,您可能需要研究最初开发UNIX和C的PDP-n机器的体系结构.

C历史页面显示,这unsigned实际上是该语言的一个相对较晚的人,出现在70年代中期的某个时候:

在1973-1980期间,语言增长了一点:类型结构获得了无符号,长,联合和枚举类型,并且结构变成了几乎一流的对象(缺少文字符号).

  • @Dervin,为什么不呢?`signed`类型适用于日常生活中使用的正值和负值. (2认同)

Kei*_*son 5

它主要是向后兼容性,而C语言来自早期语言,它们不能轻易支持有符号和无符号整数.

C源自一种名为B的旧语言,它来自一种更老的语言,称为BCPL(它是CPL的简化版本).

BCPL是一种基本上无类型的语言.变量声明没有指定对象的类型; 相反,对给定变量的操作会将其视为给定类型.

在BCPL运营商+,-,*,/,和REM对待自己的操作数为签署整数,并取得整数结果.

如果BCPL支持无符号整数,那么要么必须有另一组运算符无符号操作数,要么它根本不能代表负数.(请注意,BCPL不支持浮点.)

B的语法与BCPL完全不同(并且更接近于C),但它保留了许多相同的语义.特别是,变量和函数默认为整数类型 - 并且没有unsigned关键字.

早期的C,基于B,也没有unsigned关键字.它只有四个基本的数字类型:char,int,float,和double.(unsigned加入,随着long,union以及enum,1973年和1980年之间的某个时间),由于语言的弱类型性质,程序员有时候使用指针时,他们需要无符号运算.

没有声明类型的实体隐含类型的"特征" int保留在C中,直到1999 ISO标准最终删除了"隐式int"规则.

此外,有符号整数类型往往比无符号类型更有.表示负值的能力非常方便.给定典型的环绕语义,两个小值的无符号减法中的错误可以产生巨大的正值(3 - 4 == 65535例如,对于16位无符号类型).即使在作为所有这些语言的主要目标的系统编程领域中,有时也需要表示负值(例如,某些数量的变化).

参考文献: