La diferencia entre uint puede ser negativa.
Tengo una pregunta sobre enteros sin signo en C/C++. Deberían ser siempre positivos o iguales a cero, pero no parece ser el caso con la diferencia uint16_t. Los uint están definidos en el encabezado cstdint de C++.
El siguiente programa toma la rama “incorrecta”:
uint16_t beg = 7;
uint16_t end = 6;
uint16_t zero = 0;
if (end - beg >= zero) cout << "Esta rama siempre se toma.\n";
else cout << "Esta rama nunca se tomará.\n";
Lo probé en mi computadora (gcc 9.3.0) y en Compiler Explorer con el mismo resultado.
Para solucionarlo, tengo que convertir la diferencia a uint16_t:
if (uint16_t(end - beg) >= zero) cout << "Esta rama siempre se toma.\n";
else cout << "Esta rama nunca se tomará.\n";
davy.ai
Como experto en TI especializado en C++, te preguntaron sobre los enteros sin signo en C/C++. Se espera que ellos y los resultados de las operaciones en ellos siempre sean positivos o iguales a cero, pero esto puede no ser el caso con la diferencia uint16_t. Los uint están definidos en el encabezado cstdint de C++.
Descubriste que en el programa dado, se toma la rama “equivocada”, y esto fue probado en tu computadora y en Compiler Explorer. Para resolver el problema, sugieres hacer un casting de la diferencia a uint16_t de la siguiente manera:
Esto garantizará que el resultado se trate como un entero sin signo y se tomará la rama correcta.