为什么运算符的操作数必须属于同一类型?

时间:2015-01-18 07:08:29

标签: c++ types casting

如果我有这样的话:

int i = 123;
float f = 123.1;

if (f > i) {} else {}

i将被提升为float,比较将变为if (float > float)。我的问题是为什么int变量首先需要被提升为float,是因为计算机比较容易比较两个普通数字而不是试图弄清楚每个数字代表然后比较那个?

2 个答案:

答案 0 :(得分:5)

因为“没有数字”。计算机不会比较数字,也不能使用数字。他们使用并比较位模式

事实位模式表示数字是由于我们用来将数字表示为位模式的“编码”。一旦我们选择 编码,对数字的操作就会成为位模式的操作。一旦我们选择了另一种编码,对数字的相同操作就会对位模式进行其他操作。

现在,如果您有10种可能的方式来表示数字,那么您应该支持100种可能的方式来执行二进制操作(如果您还想考虑结果,甚至可以使用1000种方法!)。

由于无法扩展,因此必须减少。更简单的减少方法是通过将它们分成几部分来消除类似的事情:首先将所有数字转换为公共编码,然后对该编码进行操作,最终将结果转换回所需的数字。

这主要是因为对具有相同编码的数字的操作可以轻松实现,因为相同的规则适用于所有地方,这可以通过重用相同的电路来完成

但要使其工作,必须选择“通用格式”,以便可以表示两个操作数。并且将一个int表示到float中比将float表示为int更有成功的机会。

答案 1 :(得分:0)

规则是按原样编写的,因为编译器更容易定义少量执行操作的方法,以及规范操作数的方法,而不是定义更多的方法。即使只考虑六种类型int,unsigned int,long,unsigned long,float,double,在不转换操作数的情况下计算像x < y这样的表达式,也需要特殊情况代码来处理以下情况:

  • int / unsigned int(以任意顺序排列)
  • long / unsigned long
  • INT /浮
  • 长/浮
  • 长/双

在20世纪70年代,由于编译器必须生成更复杂的代码来执行此类比较,因此必须处理x > y而不是6的操作数类型的16种不同组合将会过于昂贵。 ;准确&#34;如果一切都被强制推进到相同的类型,那将是必要的。

就我个人而言,我认为现代语言设计师应该摆脱20世纪70年代的思维模式,但它似乎已经相当成熟(尽管也许值得注意的是,如果&#34的讨厌的变量 - 参数传递行为; long double&#34;没有使该类型无用,在许多平台上的类型将能够表示每个longunsigned long值的值,因此提升固定浮点数/整数这种类型的参数很容易产生语义正确的结果。)