C 关系运算符和变量 #包括 内部主(空) { int x=3; 浮动y=3.0; 如果(x==y) printf(“x和y相等\n”); 其他的 printf(“x和y不相等\n”); 返回0; }

C 关系运算符和变量 #包括 内部主(空) { int x=3; 浮动y=3.0; 如果(x==y) printf(“x和y相等\n”); 其他的 printf(“x和y不相等\n”); 返回0; },c,floating-point,integer,C,Floating Point,Integer,根据数学,两者是相等的 编译器如何识别两者相等? (我对编程完全陌生,如果我的问题有任何错误,我很抱歉) 提前感谢。编译器将进行转换,然后进行比较。在这种特殊情况下,两边都转换为浮点类型。编译器将把两个变量中的一个转换为另一个类型,比如说y到int,现在两者都是相同的类型,可以进行比较 下一步是值的内部减法和零标志的测试。如果两个值相等,则减法结果将为0,从而设置零标志。int x=3; 由于int,上述变量x存储为标准二进制格式,即0000 0011 浮动y=3.0; 上述变量y以IEEE 7

根据数学,两者是相等的

编译器如何识别两者相等? (我对编程完全陌生,如果我的问题有任何错误,我很抱歉)


提前感谢。

编译器将进行转换,然后进行比较。在这种特殊情况下,两边都转换为浮点类型。

编译器将把两个变量中的一个转换为另一个类型,比如说y到int,现在两者都是相同的类型,可以进行比较

下一步是值的内部减法和零标志的测试。如果两个值相等,则减法结果将为0,从而设置零标志。

int x=3; 由于int,上述变量x存储为标准二进制格式,即0000 0011

浮动y=3.0; 上述变量y以IEEE 754浮点格式存储。i、 e值y存储在具有符号位、指数和尾数的三个不同组的内存位置中

在这里,编译器将生成一个可执行文件,并添加有关这两个变量的信息,例如x变量是整数类型,y变量是浮点类型。
因此,当它被存储在内存中以便执行时,这些变量将按照编译器的可执行文件的建议进行存储。

对于计算机,所有数字都是二进制的:
0000 0011==0000 0011
,因为您的code if语句隐式地等价于
if((float)x==y){…}
@Rizier123:我不确定二进制文件与此有什么关系
float
int
有不同的表示。@OliverCharlesworth我想说的是,计算机不知道13或23.45是什么。计算机仅与0一起工作,1编译器无法识别任何内容。编译器会创建一组机器指令供您的机器执行。我想两边都会升级为
double
。而且,比较可能会失败。@haccks否,右操作数将保持为
浮点
,左操作数将转换为
浮点
@haccks:通常算术转换中的相关规则是[expr]/(10.4):“如果任一操作数为
浮点
,则另一个操作数应转换为
浮点
”@eksb;那么,如何将
float
转换为
double
?@KerrekSB;嗯,我同意比较不会失败,但现在我对促销感兴趣。那么,它将被提升为
浮点
还是
双精度
?否;C标准要求将int转换为float。C中也没有零标志。@Jens是的,C将x转换为float,但不是每种语言都这样做!我的答案是关于编译器如何解决这个问题的常见答案(如OP所问)。如果你想,你也可以访问C中的标志!通常这些机制对程序员是隐藏的,但我再次以一种常见的方式解释了在底层ISA中如何处理相等关系。
#include<stdio.h>    
int main(void)
{
    int x = 3;
    float y = 3.0;

    if (x == y)
        printf("x and y are equal\n");
    else
        printf("x and y are not equal\n");
    return 0;
}