Как работают знаки сравнения, больше, меньше?

В сравнении двух чисел мы обычно используем оператор " if ", который при истинности (по сути единица) выражения запускает код, который находится внутри, а при ложном пропускает этот код. Вроде всё просто сравнение, но как компьютер понимает что два числа равны или больше, или меньше и как работает этот оператор " if "?
В ассемблере есть такая команда CMP, которая сравнивает два числа, там же сравнивание идёт по следующему алгоритму:
CMP A, B
  1. Из A вычитается B
  2. Если результат равен нулю, то A=B
  3. Если числа равны, то устанавливается флаг ZF
То есть мы смотрим что находится в флаге ZF:
  1. Если ZF = 1, то числа равны
  2. Если ZF = 0, то числа НЕ равны
Это простой пример, ведь команда сравнивает только два числа. Теперь посмотрим на оператор if в Си.
	int a;
	int b;
	int c;
	a = 5;
	b = 5;
	c = 0;
	
	if ((a == 5) && (b == 5)) {
		c = 12;
	}
	else { c = 0; }
Логический знак && можно считать, как знак умножения. Мы можем в принципе преобразовать эту функцию в одну формулу:
c = 12 * (!(a - 5) * !(b - 5));
Знак восклицания работает следующим образом любое число кроме нуля преобразует в ноль, а ноль в единицу.
Но это лишь формула, которую я подогнал для данного сравнения и то сомнительно. Как же в программировании компилятор преобразует if и логические знаки? Где можно почитать об этом?

Ответ

Почитай про boolean и как работают его операции. Он не связан с числовыми типами (кроме Си, но не будем трогать магию слабой типизации), советую почитать про типизацию и приведение типов в C++. Дальше можно переходить к тому, что такое int32/64, а дальше ieee float

Крайне не рекомендую объединять логические и численные операции - разбираться в этом потом очень больно, даже самому себе через пару месяцев


Views: 668

ScorpioT1000 #1 - 2 years ago (изм. ) 0
Голосов: +0 / -0

Почитай про boolean и как работают его операции. Он не связан с числовыми типами (кроме Си, но не будем трогать магию слабой типизации), советую почитать про типизацию и приведение типов в C++. Дальше можно переходить к тому, что такое int32/64, а дальше ieee float

Крайне не рекомендую объединять логические и численные операции - разбираться в этом потом очень больно, даже самому себе через пару месяцев
PT153 #2 - 2 years ago (изм. ) 0
Голосов: +0 / -0
Обычный goto. Если флаг 1, то goto в такой лейбл, если 0, то в другой. В ассемблере MIPS есть специальные функции сравнения.
Ev3nt #3 - 2 years ago 2
Голосов: +2 / -0
Также прочитай про условные и безусловные переходы: jmp, ja, jb, je, jnz/jne и т.д.