1.  long int temp;
2.  int product = -1;

3.  temp = (long int)product & 0xFFFFFFFF;

4.  temp = temp << 32;

Sé que temp es de 64 bits mientras que product es de 32 bits.

Estoy un poco confundido acerca de las líneas 3 y 4.

Estamos transmitiendo product como long int, lo que significa que product debería representarse como 64 bits y hacer un AND bit a bit con 0xFFFFFFFF. La representación hexadecimal de 0xFFFFFFFF es toda 1, por lo que AND debería conservar la representación binaria de -1?

Dado que -1 en binario es 1111111111111111, ¿temp ahora sería 32 1 seguido de 32 0, o viceversa? Si es lo primero, ¿tiene algún sentido hacer el desplazamiento a la izquierda en la línea 4?

Principalmente estoy confundido acerca de la conversión de 32 bits a 64 bits aquí y cómo se ve en binario.

0
qbuffer 10 oct. 2019 a las 20:11

1 respuesta

La mejor respuesta

En la línea 3 sucede lo siguiente:

Dado que el operador de conversión de tipos tiene una prioridad de operadores más alta que & operador, el programa primero convierte la representación de 32 bits del número -1 en la variable product en una representación temporal de 64 bits del número -1. Lo hace sign extendiendo los 32 bits superiores. Dado que el bit de signo tiene el número 1, los 32 bits superiores se rellenarán con unos, de modo que el valor temporal de 64 bits ahora consta de 64 unos. Ahora, ese valor temporal se aplica mediante AND con 0xFFFFFFFF, lo que mantiene intactos los 32 bits inferiores y pone a cero los 32 bits superiores. Entonces, ahora el valor temporal tiene el valor 0x00000000FFFFFFFF, que ya no corresponde a -1, porque el valor ahora es positivo, ya que el bit de signo (el bit más alto) ahora se establece en cero. Este valor temporal tiene el valor 4.294.967.295 en decimal. Ahora está asignado a la variable temp.

En la línea 4 sucede lo siguiente:

El valor de la variable temp, que es 0x00000000FFFFFFFF, ahora se desplaza a la izquierda en 32 bits, al valor 0xFFFFFFFF00000000. Este nuevo valor ahora se asigna a temp. Dado que el bit de signo (el bit más alto) ahora se establece en 1 nuevamente, el valor es negativo, pero ya no es -1. Su valor ahora es -4,294,967,296 en representación decimal. Consulte este artículo de Wikipedia para obtener más información sobre cómo se representan los números negativos en binario.

2
Andreas Wenzel 19 oct. 2019 a las 22:06