es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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";
Tags:  ,

Answer

  1. Avatar for 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:

    if (uint16_t(end - beg) >= zero) cout << "Siempre se tomará esta rama.\n";
    else cout << "Esta rama nunca se tomará.\n";
    

    Esto garantizará que el resultado se trate como un entero sin signo y se tomará la rama correcta.

Comments are closed.