para cada int x: x + 1> x … ¿es esto siempre cierto?

Estoy empezando a aprender C en la escuela, estoy tratando de entender los conceptos básicos.

Nuestra tarea tiene una pregunta,

para cada int x: x+1 > x

Determine si es verdadero o falso, dé un razonamiento si es verdadero y contraejime si es falso.

Estoy confundido porque nos enseñaron que el tipo int es de 32 bits y básicamente eso significa que el entero está en formato binario. ¿Es x + 1 sumndo 1 al valor decimal de 1?

 x + 1 > x 

es 1 para cada valor int , excepto para el valor INT_MAX donde INT_MAX + 1 es un desbordamiento y, por lo tanto, x + 1 > x expresión es un comportamiento indefinido para el valor x de INT_MAX .

Esto significa que un comstackdor tiene derecho a optimizar la expresión:

 x + 1 > x 

por

 1 

Como INT_MAX + 1 es un comportamiento indefinido, el comstackdor tiene derecho a decir que para esta expresión específica > INT_MAX + 1 es > INT_MAX .

Como la expresión x + 1 > x es un comportamiento no definido para x == INT_MAX , tampoco es seguro asumir que x + 1 > x puede ser falso ( 0 ).

Tenga en cuenta que si x se declaró como un unsigned int lugar de un int la situación es completamente diferente. unsigned int operandos unsigned int nunca se desbordan (se envuelven alrededor): UINT_MAX + 1 == 0 y, por lo tanto, x + 1 > x es 0 para x == UINT_MAX y 1 para todos los demás valores de x .

Los comstackdores modernos (como gcc ) usualmente aprovechan la oportunidad para optimizar esta expresión y reemplazarla con 1 .

Para el registro, hubo algunos problemas de seguridad graves con progtwigs de servidor conocidos que utilizan código como:

  if (ptr + offset < ptr) 

El código estaba destinado a desencadenar una condición de seguridad, pero el comstackdor optimizaría la instrucción if (al reemplazar la expresión con 0 ) y le permitió a un atacante obtener una escalada de privilegios en el progtwig del servidor (abriendo la posibilidad de un desbordamiento de búfer explotable si Recuerdo correctamente).

Nota para el rango de números de 32 bits es [-2147483648, 2147483647] que es igual a [-2 31 , 2 31 -1].

Entonces para la expresión x+1 > x es verdadera para [-2147483648, 2147483646]

Pero no para 2147483647 porque sumr a 2147483647 en un número de tamaño de 32 bits provoca un desbordamiento de bits en muchas implementaciones que hace x + 1 a -2147483648 Pero el comportamiento realmente no está -2147483648 en C estándar.

Asi que,

  • x + 1 > x Verdadero para x en [-2147483648, 2147483646] solamente
  • x + 1 > x , para x = 2147483647 es No definido el valor puede ser Verdadero o Falso depende del comstackdor. Si un comstackdor calcula = -2147483648 valor será Falso.

No quiero darte la respuesta, así que te responderé con una pregunta que te llevará por el buen camino.

¿Qué es x + 1 cuando x es el mayor valor posible que se puede almacenar en un entero con signo de 32 bits? (2,147,483,647)

Sí, x + 1 se sum al valor decimal de 1.

Esto será cierto casi todo el tiempo. Pero si agrega 1 a INT_MAX (que es 2 15 – 1 o mayor), puede voltear el signo. Piense en la representación decimal de 0111111 frente a 11111111 . (Obviamente no 32 bits, pero las ideas se mantienen.)

Busque el complemento de dos si está confundido acerca de por qué se voltea. Es una implementación bastante inteligente de enteros que facilita la sum.

EDITAR: INT_MAX + 1 es un comportamiento indefinido. No necesariamente se convierte en INT_MIN . Pero como x + 1 no es necesariamente > x cuando x == INT_MAX , entonces la respuesta es claramente falsa.