“更确切地说,是整体促销。在 K & R C,它实际上是(?)
如果字符值没有被提升为 int,就不可能使用它,
so making character constant int in the first place eliminated that step.
过去和现在都有多个字符常量,比如“ abc d”或者其他
许多将适合于整型。”
这与语言规范无关,但是在硬件中 CPU 通常只有一个寄存器大小——比如说32位——所以无论何时它在一个字符上实际工作(通过加、减或比较) ,当它被加载到寄存器中时,都会有一个隐式的 int 转换。编译器会在每次操作之后正确地屏蔽和移动数字,这样如果你把2加到(无符号字符)254,它会绕到0而不是256,但是在硅芯片内部,它实际上是一个整型数,直到你把它保存回内存。
这是一种学术观点,因为这种语言无论如何都可以指定一个8位的文字类型,但是在这种情况下,语言规范恰好更接近地反映了 CPU 实际上在做什么。
My guess is that C's simply carried this level of CPU-centric behaviour over, thinking of character constants occupying register sizes of memory, bearing out the common assessment of C as a "high level assembler".
在 C 世纪早期的黑暗时期,根本没有类型。当我第一次学习用 C 编程时,类型已经被引入,但函数没有原型来告诉调用者参数类型是什么。相反,它标准化了作为参数传递的所有内容要么是 int (包括所有指针)的大小,要么是 double。
这意味着在编写函数时,所有不是 double 的参数都以 int 形式存储在堆栈中,无论您如何声明它们,编译器都会在函数中放入代码来处理这个问题。
这使得事情有些不一致,所以当 K & R 写他们著名的书时,他们加入了这样一条规则: 在任何表达式中,字符文字总是被提升为 int,而不仅仅是一个函数参数。
当 ANSI 委员会第一次将 C 标准化时,他们改变了这个规则,使字符文字只是一个 int,因为这似乎是实现同样目标的一种更简单的方法。
When C++ was being designed, all functions were required to have full prototypes (this is still not required in C, although it is universally accepted as good practice). Because of this, it was decided that a character literal could be stored in a char. The advantage of this in C++ is that a function with a char parameter and a function with an int parameter have different signatures. This advantage is not the case in C.
这样做的历史原因是,C 及其前身 B 最初是在各种字长不同的 DEC PDP 小型计算机上开发的,这些计算机支持8位 ASCII,但只能在寄存器上执行算术。(不过,PDP-11并非如此,它是后来才出现的。)早期版本的 C 将 int定义为机器的原生字大小,任何小于 int的值都需要扩大到 int,以便传递给函数或从函数传递,或用于位、逻辑或算术表达式,因为这是底层硬件的工作方式。
这也是为什么整数提升规则仍然说任何小于 int的数据类型都被提升到 int。出于类似的历史原因,C 实现也允许使用 one’s-complete 数学而不是 two’s-complete 数学。与十六进制相比,八进制字符转义和八进制常量是一等公民的原因同样是,那些早期的 DEC 小型计算机的字大小可分为三字节块,而不是四字节小块。