2014-12-20 3 views
0
#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; 
} 

Согласно математике, оба равны!Операторы и переменные отношения

Как распознать компилятор оба равны? (Я совершенно не знаком с программированием, извините, если что-то не так в моем вопросе)

Заранее спасибо.

+1

Для компьютера все номера двоичные: 0000 0011 == 0000 0011' – Rizier123

+3

Поскольку оператор code if неявно эквивалентен 'if ((float) x == y) {...}'. –

+1

@ Rizier123: Я не знаю, что это за двоичный код. 'float' и' int' имеют разные представления. –

ответ

3

Компилятор выполнит преобразование, а затем выполнит сравнение. В этой конкретной ситуации обе стороны преобразуются в тип с плавающей точкой.

+0

Я думаю, что обе стороны будут повышены до «double». А также сравнение может потерпеть неудачу. – haccks

+2

@hacce no, правый операнд останется как 'float', а левый операнд будет преобразован в' float'. – ouah

+2

@haccks: соответствующее правило в обычных арифметических преобразованиях [expr]/(10.4): «если любой операнд« float », другой должен быть преобразован в' float'. » –

-1

Компилятор преобразует одну из двух переменных в другой тип, допустим, к int, теперь оба имеют один и тот же тип и могут быть сопоставлены.

Следующим шагом является внутреннее вычитание как значения, так и теста для флага ZERO. Если оба значения равны, результат вычитания будет 0, что приведет к установке флага ZERO.

+0

Nope; Стандарт C требует, чтобы int был преобразован в float. Также нет флага ZERO в C. – Jens

+0

@Jens Да, C конвертирует x в float, но не каждый язык делает это! Мой ответ - общий ответ о том, как компиляторы решают эту проблему (как задал ОП). Если вы хотите, вы также можете использовать флаги в C! Обычно эти механизмы скрыты от программистов, но снова я объяснил в общих чертах, как осуществляется равное отношение в базовой ISA. – Paebbels

0

int x = 3; Вышеуказанная переменная x сохраняется как обычный двоичный формат, то есть 0000 0011, из-за int

float y = 3.0; указанная выше переменная y сохраняется в формате с плавающей запятой IEEE 754. т.е. значение y сохраняется в ячейке памяти с тремя различными группами со знаковым битом, экспонентом и мантиссой.

здесь компилятор сгенерирует исполняемый файл и добавит информацию о двух переменных, так что переменная x является целым типом и y - тип float. Итак, когда он хранится в памяти для исполнения, эти переменные хранятся в соответствии с исполняемым файлом компилятора.

Смежные вопросы