c# - resta - regla de positivos y negativos
La forma en que C#representa los enteros negativos en la memoria y los descarta sin marcar (2)
C #, al igual que casi todos los demás en el planeta, representa números enteros en la notación de complemento de 2. Creo que en un momento u otro, se han diseñado CPU que utilizaron otra representación, pero en estos días, puedes confiar bastante en que los enteros se representen en la notación de complemento a 2.
contamos los bits de derecha a izquierda, con el bit más a la derecha, el bit 0 es el bit menos significativo y el bit más a la izquierda es el más significativo.
el bit de orden superior (extremo izquierdo) es el signo: 0 es positivo; 1 es negativo
Los bits restantes llevan el valor. Eso significa que el dominio válido de un número entero de N bits es - (2 n-1 ) <= x <= + (2 n-1 -1). Es decir, se puede representar un número negativo más que pueden ser números positivos: para un entero con signo de 16 bits, el dominio es -32,768 a +32,767.
Poner un número en el complemento a dos es fácil:
- convierte su valor absoluto en notación binaria / base-2.
- si el valor es negativo,
- invertir los bits
- agregar 1
Entonces, el valor +1 se representa como 0x0001, mientras que -1 se representa como
- 0x0001 (valor absoluto de 1 en binario)
- 0xFFFE (bits invertidos)
- 0xFFFF (agregar 1)
O 0xFFFF
La razón para la notación de complemento de dos es que simplifica el diseño de la CPU: dado que la resta es la suma del negativo (por ejemplo, 3-2 es igual a 3 + -2), no tienen que diseñar circuitos de sustracción:
1-1 es lo mismo que 1 + -1 y se evalúa a cero.
o en hex,
0x0001 (decimal +1) + 0xFFFF (decimal -1) ====== 0x0000 (decimal 0)
En la mayoría de las CPU, el acarreo dentro o fuera del bit de orden alto establece el indicador de desbordamiento de punto fijo.
C # tiene varios tipos de valores, y cada uno cumple su propio propósito. Int32 varía de - (0x7FFFFFFF + 1) a 0x7FFFFFFF, y de cada máquina que he ejecutado, parece que no seleccionado ((int) 0xFFFFFFFF) siempre me dio un valor resultante de -1. Este es siempre el caso? Además, .NET siempre representa -1 como 0xFFFFFFFF en la memoria en cualquier sistema? ¿El bit más importante es siempre el signo? ¿Siempre utiliza la representación binaria firmada por el Complemento de dos para enteros?
La documentación para System.Int32 establece explícitamente que está almacenada en forma de complemento de dos. Está en la parte inferior:
Además de trabajar con enteros individuales como valores decimales, es posible que desee realizar operaciones en modo bit con valores enteros o trabajar con representaciones binarias o hexadecimales de valores enteros. Los valores Int32 se representan en 31 bits, y el bit treinta y dos se usa como un bit de signo. Los valores positivos se representan mediante el uso de la representación de signo y magnitud. Los valores negativos están en la representación del complemento de dos. Es importante tener esto en cuenta cuando realiza operaciones bit a bit en valores Int32 o cuando trabaja con bits individuales. Para realizar una operación numérica, booleana o de comparación en dos valores no decimales, ambos valores deben usar la misma representación.
Entonces parece que la respuesta a todas sus preguntas es sí.
También el rango para un Int32 es de - (0x80000000) a 0x7FFFFFFFF.