2012-07-27 4 views
5

En un compilador de C de 16 bits, tenemos 2 bytes para almacenar un entero y 1 byte para un carácter. Para enteros sin signo, el rango es 0 a 65535. Para enteros con signo el rango es -32768 a 32767. Para carácter sin signo, 0 a 255. Según el tipo entero, ¿no debería el rango de caracteres con signo ser -128 a 127. Pero ¿Por qué -127 a 127? ¿Qué hay del resto?Confusión en el rango de tipos de datos de 16 bits

Respuesta

15

creo que va a mezclar dos cosas:

  1. Qué rangos de la norma requiere para signed char, etc. int
  2. Qué rangos son implementadas en la mayoría del hardware en estos días.

No es necesario que sean necesariamente iguales siempre que el rango implementado sea un superconjunto del rango requerido por la norma.

Según the C standard, los valores definido por la implementación de SCHAR_MIN y SCHAR_MAXserá igual o mayor en magnitud (valor absoluto) a, y del mismo signo que:

SCHAR_MIN -127 
SCHAR_MAX +127 

es decir solamente 255 valores, no 256.

Sin embargo, los límites definidos por una implementación conforme pueden ser 'mayores' en magnitud que estos. es decir, [-128,+127] también está permitido por la norma. Y como la mayoría de las máquinas representan números en el 2's complement form, [-128,+127] es el rango que podrá ver más a menudo.

realidad, incluso el rango mínimo de int definido por la norma C es simétrica aproximadamente cero. Es:

INT_MIN -32767 
INT_MAX +32767 

es decir sólo 65535 valores, no 65536.

Pero, de nuevo, la mayoría de las máquinas utilizan la representación 2's complement, y esto significa que ofrecen el rango [-32768,+32767].

Mientras que en 2's complement form es posible representar 256 valores firmados en 8 bits (es decir, [-128,+127]), hay otras representaciones de números firmados donde esto no es posible.

En el sign-magnitude representation, un bit está reservado para la muestra, así:

00000000 
10000000 

ambos significan la misma cosa, es decir 0 (o más bien, +0 y -0).

Esto significa, se pierde un valor. Y, por lo tanto, la representación de magnitud de signo solo puede contener valores de -127 (11111111) a +127 (01111111) en 8 bits.

En el one's complement representation (negar haciendo bit a bit NO):

00000000 
11111111 

ambos significan la misma cosa, es decir, 0.

Nuevamente, solo los valores de -127 (10000000) a +127 (01111111) se pueden representar en 8 bits.

Si el estándar C requiere que el rango sea [-128,+127], esto esencialmente excluiría a las máquinas que usan tales representaciones de poder ejecutar programas C de manera eficiente. Necesitarían un bit adicional para representar este rango, por lo que necesitarían 9 bits para almacenar caracteres firmados en lugar de 8. La conclusión lógica basada en lo anterior es: Esta es la razón por la cual el estándar C requiere [-127,+127] para los caracteres firmados. es decir, para permitir a las implementaciones la libertad de elegir una forma de representación entera que se adapte a sus necesidades y, al mismo tiempo, ser capaces de cumplir el estándar de una manera eficiente. La misma lógica se aplica al int también.

+0

Gracias por su explicación. –

Cuestiones relacionadas