Saltar al contenido

Transmitir uint32_t a int32_t y compararlos después

Queremos compartir contigo la mejor respuesta que hallamos online. Deseamos que te sirva de ayuda y si puedes aportar alguna mejora hazlo con libertad.

Solución:

Una conversión fuera de rango a un tipo de entero con signo, como lo está haciendo, es implementación definida.

En la mayoría de las implementaciones que es probable que encuentre, convertir el valor máximo para un uint32_t a un int32_t significa retener el patrón de bits y tratarlo como un valor con signo. Esto significa que b1 se le asigna el valor -1.

Cuando luego comparas a1 y b1, el conversiones aritméticas habituales solicitar. Estos se detallan en la sección 6.3.1.8 del estándar C:

Si ambos operandos tienen el mismo tipo, entonces no se necesita más conversión.

De lo contrario, si ambos operandos tienen tipos de enteros con signo o ambos tienen tipos de enteros sin signo, el operando con el tipo de menor rango de conversión de enteros se convierte al tipo de operando con mayor rango.

De lo contrario, si el operando que tiene un tipo entero sin signo tiene un rango mayor o igual al rango del tipo del otro operando, entonces el operando con tipo entero con signo se convierte al tipo del operando con tipo entero sin signo.

De lo contrario, si el tipo del operando con tipo entero con signo puede representar todos los valores del tipo del operando con tipo entero sin signo, entonces el operando con tipo entero sin signo se convierte al tipo del operando con tipo entero con signo.

De lo contrario, ambos operandos se convierten a los sin signo.
tipo entero correspondiente al tipo del operando con tipo entero con signo

La parte resaltada es lo que se aplica en este caso, ya que uint32_t y int32_t tienen el mismo rango, entonces el valor de b1 se convierte a tipo uint32_t.

Al convertir un valor fuera de rango para un tipo sin signo, esto se logra sumando o restando numéricamente uno más que el valor máximo del tipo sin signo repetidamente hasta que el valor esté dentro del rango. Esto significa que cualquier exceso de bytes del valor de origen se trunca y lo que queda se trata como un valor sin firmar.

Esta conversión se detalla en la sección 6.3.1.3 del estándar C:

1 Cuando un valor con tipo entero se convierte a otro tipo entero que no sea _Bool, si el valor se puede representar con el nuevo tipo, no se modifica.

2 De lo contrario, si el nuevo tipo no tiene signo, el valor se convierte sumando o restando repetidamente uno más que el valor máximo que se puede representar en el nuevo tipo hasta que el valor esté en el rango del nuevo tipo.

3 De lo contrario, el nuevo tipo se firma y el valor no se puede representar en él; el resultado está definido por la implementación o se emite una señal definida por la implementación

En este caso, el párrafo 3 se aplica cuando usted asigna por primera vez a1 a b1, y el párrafo 2 se aplica cuando haces la comparación y b1 Está convertido. Eso significa que el valor -1 se convierte en el valor UINT32_MAX, por lo que la comparación se evalúa como true.

el incorporado == solo puede comparar valores del mismo tipo. Si los tipos de los operandos son diferentes, se convierten al mismo tipo de antemano. (Consulte cppreference para saber cómo se elige este tipo).

En este caso, b1 se convierte en uint32_t antes de realizar la comparación.

En general, las conversiones de no firmado a firmado están definidas por la implementación (6.3.1.3) a partir de ahora (esto puede cambiar en versiones futuras del estándar C).

En la práctica, los números enteros serán el complemento a dos y las conversiones en cualquier dirección no serán operativas: los mismos datos se interpretarán de manera diferente de acuerdo con el funcionamiento de la aritmética del complemento a dos.

La igualdad en su caso es causada por el firmado b1 convirtiéndose semánticamente en un a1tipo sin signo de en la comparación debido a las conversiones aritméticas habituales (6.3.1.8).

Eres capaz de avalar nuestro análisis ejecutando un comentario y dejando una puntuación te damos la bienvenida.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *