为什么当我除以两个整数时,结果是一个整数而不是一个浮点数,为什么选择这个设计决策?
发布于 2015-01-24 21:55:07
当早期C被设计时,许多当代硬件没有浮点支持.
当浮点类型通过其前身(BCPL和B)添加到C中时,除法操作符的整数语义保持不变。
BCPL手册提供了一个有趣的读物(强调我的意思):
5.1算术表达式 句法形式:
E1 * E2,E1 / E2,E1 rem E2,E1 + E2,+E1,E1 - E2,-E1语义:所有这些运算符都将其操作数的Rvalue解释为有符号整数,而都生成整数结果。 … 除数运算符/得到正确的结果[如果E1可被E2整除,则E1被E2除法;否则它是与实现有关的,但舍入误差永远不会大于1。 操作符rem生成E1的其余部分除以E2;其确切的规范取决于实现。
很明显,可移植性不是一个问题,语言可以做任何底层硬件所做的事情。
即使在今天,仍然有很多平台支持C,但没有浮点硬件(例如,小型嵌入式平台)。
一些现代高级语言选择将int / int定义为浮点除法.例如,Python3有一个单独的运算符//,用于整数除法。有趣的是,整数除法运算符有与C对应的舍入规则不同。*
如果您对C的历史感兴趣,请看一下Dennis的C语言的发展。
* Python整数也很有趣,因为它们是任意精度。
https://stackoverflow.com/questions/28130439
复制相似问题