Comparteix via


Extensión de firma

Cuando un entero de 32 bits con signo es negativo, su bit más alto es igual a uno. Cuando este entero de 32 bits con signo se convierte en un número de 64 bits, los bits altos se pueden establecer en cero (conservando el entero sin signo y el valor hexadecimal del número) o los bits altos se pueden establecer en uno (conservando el valor firmado del número). Esta última situación se denomina extensión de signo.

El depurador sigue diferentes reglas para la extensión de signo en expresiones MASM, en expresiones C++ y al visualizar números.

Extensión de signo en expresiones MASM

En determinadas condiciones, los números se extienden por signo automáticamente mediante el evaluador de expresiones MASM. La extensión de signo solo puede afectar a los números de 0x80000000 a 0xFFFFFFFF. Es decir, la extensión de signo afecta solo a los números que se pueden escribir en 32 bits con el bit alto igual a 1.

El número 0x12345678 siempre permanece 0x00000000'12345678 cuando el depurador lo trata como un número de 64 bits. Por otro lado, cuando 0x890ABCDE se trata como un valor de 64 bits, podría permanecer 0x00000000`890ABCDE o el evaluador de expresiones MASM podría extender el signo a 0xFFFFFFFF`890ABCDE.

Un número de 0x80000000 hasta 0xFFFFFFFF se extiende de signo según los criterios siguientes:

  • Las constantes numéricas nunca se extienden en modo de usuario. En el modo kernel, una constante numérica se amplía en su signo a menos que contenga un acento grave ( ` ) antes de los bytes más bajos. Por ejemplo, en el modo kernel, los números hexadecimales EEAA1122 y 00000000EEAA1122 son signo extendidos, pero 000000000'EEAA1122 y 0'EEAA1122 no.

  • Un registro de 32 bits se extiende en ambos modos.

  • Los pseudo-registros siempre se almacenan como valores de 64 bits. No se extiende el signo cuando se evalúan. Cuando se asigna un pseudo-registro a un valor, la expresión que se usa se evalúa según los criterios estándar de C++.

  • Los números individuales y los registros en una expresión se pueden extender con signo, pero no se extiende con signo ningún otro cálculo durante la evaluación de expresiones. Como resultado, puede enmascarar los bits altos de un número o registro mediante la sintaxis siguiente.

    ( 0x0`FFFFFFFF & expression )
    

Extensión del signo en expresiones de C++

Cuando el depurador evalúa una expresión de C++, se aplican las reglas siguientes:

  • Los registros y los pseudo-registros nunca se extienden.

  • Todos los demás valores se tratan exactamente como C++ trataría los valores de su tipo.

Mostrando números Sign-Extended y números de 64 bits

Aparte de los registros de 32 y 16 bits, todos los números se almacenan internamente en el depurador como valores de 64 bits. Sin embargo, cuando un número cumple determinados criterios, el depurador lo muestra como un número de 32 bits en la salida del comando.

El depurador usa los siguientes criterios para determinar cómo mostrar números:

  • Si los 32 bits altos de un número son ceros (es decir, si el número es de 0x00000000'00000000 a 0x00000000'FFFFFFFF), el depurador muestra el número como un número de 32 bits.

  • Si los 32 bits altos de un número son todos y si el bit más alto de los 32 bits bajos es también uno (es decir, si el número es de 0xFFFFFFFF'80000000 a 0xFFFFFFFF'FFFFFFFF), el depurador supone que el número es un número de 32 bits extendido por signo y lo muestra como un número de 32 bits.

  • Si la condición anterior no se aplica (es decir, si el número es de 0x00000001'00000000 a 0xFFFFFFFF'7FFFFFFFFF), el depurador muestra el número como un número de 64 bits.

Debido a estas reglas de visualización, cuando se muestra un número como un número de 32 bits de 0x80000000 a 0xFFFFFFFF, no puede confirmar si los 32 bits altos son todos o ceros. Para distinguir entre estos dos casos, debe realizar un cálculo adicional en el número (como enmascarar uno o varios de los bits altos y mostrar el resultado).

Consulte también

Números y operadores de MASM

Números y operadores de C++

Expresiones de MASM frente a expresiones de C++

Ejemplos de expresiones mixtas