visual todas studio las funciones ejemplos ejecutar desde compiler compile compilar code c visual-studio int turbo-c

c - todas - ¿Por qué el rango de int es de-32768 a 32767?



visual studio c compiler (5)

Con 2s, los números negativos del complemento se definen como bitwise y no 1, lo que reduce el rango de números posibles en un número dado de bits en 1 en el lado negativo.

¿Por qué el rango de cualquier tipo de datos es mayor en el lado negativo en comparación con el lado positivo?

Por ejemplo, en caso de entero:

En Turbo C, su rango es de -32768 a 32767 y para Visual Studio es de -2147483648 a 2147483647 .

Lo mismo sucede con otros tipos de datos ...

[UPD: Establecer valores límite adecuados para Visual Studio ]


Debido a cómo se almacenan los números. Los números firmados se almacenan utilizando algo llamado "notación de complemento de dos".

Recuerda que todas las variables tienen una cierta cantidad de bits. Si el más significativo de ellos, el de la izquierda, es un 0, entonces el número no es negativo (es decir, positivo o cero), y el resto de los bits simplemente representan el valor.

Sin embargo, si el bit más a la izquierda es un 1, entonces el número es negativo. El valor real del número se puede obtener restando 2 ^ n del número entero representado (como una cantidad sin signo, incluido el 1 más a la izquierda), donde n es la cantidad de bits que tiene la variable.

Dado que solo se dejan n - 1 bits para el valor real (la "mantisa") del número, las combinaciones posibles son 2 ^ (n - 1). Para números positivos / cero, esto es fácil: van de 0 a 2 ^ (n - 1) - 1. Ese -1 es el cero en sí mismo. Por ejemplo, si solo tienes cuatro combinaciones posibles, esas combinaciones representaría 0, 1, 2 y 3 (observe cómo hay cuatro números): va de 0 a 4 - 1.

Para los números negativos, recuerde que el bit más a la izquierda es 1, por lo que el número completo representado va entre 2 ^ (n - 1) y (2 ^ n) - 1 (¡los paréntesis son muy importantes allí!). Sin embargo, como dije, debes tomar 2 ^ n de distancia para obtener el valor real del número. 2 ^ (n - 1) - 2 ^ n es - (2 ^ (n - 1)), y ((2 ^ n) - 1) - 2 ^ n es -1. Por lo tanto, el rango de los números negativos es - (2 ^ (n - 1)) a -1.

Ponga todo eso junto y obtendrá -2 ^ (n - 1) a 2 ^ (n - 1) - 1. Como puede ver, el límite superior obtiene un -1 que el límite inferior no.

Y es por eso que hay un número negativo más que positivo.


El rango mínimo requerido por C es, en realidad, de -32767 a 32767, porque tiene que atender el complemento de dos, el complemento de uno y la codificación de signo / magnitud para números negativos, todo lo cual permite el estándar C. Consulte el Annex E, Implementation limits de Annex E, Implementation limits de C11 (y C99) para obtener detalles sobre los rangos mínimos para los tipos de datos.

Su pregunta se refiere solo a la variante de complemento de los dos y la razón es simple. Con 16 bits, puede representar 2 16 (o 65,536) valores diferentes y cero tiene que ser uno de esos. Por lo tanto, queda un número impar de valores, de los cuales la mayoría (por uno) son valores negativos:

1 thru 32767 = 37267 values 0 = 1 value -1 thru -32768 = 32768 values ----- 65536 values

El complemento de ambos y la codificación de magnitud de signo permiten un valor de cero negativo (así como un cero positivo), lo que significa que hay un patrón de bits menos disponible para los números que no son cero, por lo tanto, el rango mínimo reducido que se encuentra en el estándar .

1 thru 32767 = 37267 values 0 = 1 value -0 = 1 value -1 thru -32767 = 32767 values ----- 65536 values

El complemento de Two es en realidad un ingenioso esquema de codificación porque los números positivos y negativos se pueden agregar junto con el mismo hardware simple. Otros esquemas de codificación tienden a requerir hardware más elaborado para realizar la misma tarea.

Para una explicación más completa sobre cómo funciona el complemento de dos, vea la página de wikipedia .


Por lo general, debido al uso de un sistema de complemento a dos para almacenar valores negativos, cuando se invierte el bit de signo en un entero, está sesgado hacia el negativo.

El rango debe ser: - (2 ^ (n-1)) - ((2 ^ (n-1) -1)


Porque el rango incluye cero. El número de valores diferentes que puede representar un entero de n bits es 2 ^ n. Eso significa que un entero de 16 bits puede representar 65536 valores diferentes. Si se trata de un entero de 16 bits sin signo, puede representar 0-65535 (inclusive). La convención para enteros con signo es representar -32768 a 32767, -214748368 a 214748367, etc.