2009-12-21 31 views
5
  1. caracteres en 'C' se utilizan para representar caracteres.
  2. números que representan personajes de todas las páginas de códigos son siempre positivos.

¿De qué sirve tener caracteres firmados? ¿Los valores negativos contenidos en caracteres se usan solo como valores integrales en un tipo de datos integrales más pequeños que int y short? ¿No tienen otra interpretación? (Como valores positivos en caracteres que representan caracteres)importancia de los valores negativos de tipo char en C

Respuesta

11

caracteres en 'C' se utilizan para representar caracteres.

No siempre, los caracteres se utilizan para representar bytes, son el único tipo en c con un tamaño conocido.

+12

Si quieres decir que son el único tipo en el que sizeof (type) se garantiza que es 1, sí. No se garantiza que sean 8 bits. –

+2

Lo único que C dice sobre el tamaño de un char es que es 1. No dice cuáles son las unidades de 1. –

+1

PDP-10, por ejemplo, utiliza bytes de 9 bits. –

2

De Jack Klein's Home Page:

signed char puede contener todos los valores en el rango de SCHAR_MIN a SCHAR_MAX, definido en limits.h. SCHAR_MIN debe ser -127 o menos (más negativo), y SCHAR_MAX debe ser 127 o mayor. Tenga en cuenta que muchos compiladores para procesadores que utilizan una representación complementaria de 2 admiten SCHAR_MIN de -128, pero esto no es requerido por los estándares.

Por lo que puedo decir, no hay un "significado" oficial de signed char. Sin embargo, una cosa a tener en cuenta es que todos los caracteres ASCII normales caen en el rango 0-127. Por lo tanto, se puede utilizar el tipo de signed char para restringir los valores legales para el rango de 0-127, y definir nada menos que 0 como un error.

Por ejemplo, si tuviera una función que busca texto ASCII y devuelve el carácter que aparece con mayor frecuencia, quizás deba definir un valor de retorno negativo para indicar que hay dos o más caracteres vinculados para el más frecuente. Esta no es necesariamente una buena manera de hacer las cosas, es solo un ejemplo fuera de lo común.

+1

Muy simple, hay 3 tipos de 'char':' unsigned char', 'signed char' y' char'. Los primeros dos son explícitos y se utilizan para manipular el tipo de datos numéricos más pequeños. Sin embargo, 'char', la implementación se define si está firmado o no. En resumen, cuando el signo es significativo, agregue el calificador. –

0

En C y C++ caracteres pueden ser con o sin signo. Se puede usar una variable char para mantener un pequeño valor entero. Esto es útil por varias razones:

  • En máquinas pequeñas, p. un micro de 8 bits. Podría permitir un acceso y una manipulación más eficientes.
  • Si desea tener una gran variedad de valores pequeños, digamos 100K, puede guardar una gran cantidad de memoria usando una matriz de caracteres, en lugar de. p.ej. Ints.

En C, un carácter literal es una constante entera. '0' es igual a 48.

+0

Nit: ''0'' puede o no ser 48. Es un número entero pequeño, capaz de caber en un' char', pero no necesita ser 48. –

+0

Me tienes. Me olvidé de EBCDIC. ;-) –

+1

Richard, siempre está la DeathStation 9000 [http://dialspace.dial.pipex.com/prod/dialspace/town/green/gfd34/art/] :) – pmg

4

Los números que representan caracteres en todas las páginas de códigos son siempre positivos.

Erm ... mal!?

de la norma C99, el énfasis es mío:

Si un miembro del carácter básico de ejecución establecido se almacena en un objeto char, su valor se garantiza que sea positivo.

No se garantiza que todos los caracteres válidos de todas las páginas de códigos sean positivos. Si char está firmado o no firmado, ¡la implementación está definida!

4

Solamente los caracteres del juego de caracteres de ejecución básica se garantiza que sea no negativo (C99, 6.5.2 § 3):

Un objeto declarado como tipo char es lo suficientemente grande como para almacenar cualquier miembro de la conjunto de caracteres básicos de ejecución Si un miembro del conjunto de caracteres de ejecución básica se almacena en un objeto char , se garantiza que su valor es no negativo. Si cualquier otro carácter es almacenado en un objeto char, el valor resultante está definido por la implementación, pero debe estar dentro del rango de valores que se pueden representar en ese tipo.

Tienes que discernir entre la char tipo 'plain' y los tipos signed char y unsigned char así: signed char y unsigned char son tipos enteros ordinarios para los que se cumple lo siguiente (C99, 6.5.2 § 5):

Un objeto declarado como tipo char firmado ocupa la misma cantidad de almacenamiento que '' plain '' char.

+0

Además, si 'char' está firmado en su plataforma y lee un carácter con un punto de código mayor que 'CHAR_MAX' (digamos un carácter como æ en ISO-8859-1, que tiene un punto de código' 0xE6'), es bastante probable que obtenga un valor de carácter negativo. – caf

0

En C, un char (incluyendo signed char y unsigned char) se utiliza para almacenar un byte , que el estándar de C define como un pequeño número entero al menos 8 bits de tamaño.

Tener los bytes firmados y sin firmar es tan útil como tener enteros más grandes. Si está almacenando una gran cantidad de números pequeños (0..255 para unsigned, -127..127 para signed [1]) en una matriz, puede preferir utilizar bytes para ellos en lugar de, digamos, short ints , para ahorrar espacio

Históricamente, un byte y un carácter de texto eran prácticamente lo mismo. Entonces alguien se dio cuenta de que hay más idiomas que inglés. En estos días, el texto es mucho más complicado, pero es demasiado tarde para cambiar el nombre del tipo de char en C.

[1] -128..127 para máquinas con representación de complemento a dos para números negativos, pero el C el estándar no garantiza eso.

+0

En realidad, el término "byte" no se define en ninguna parte. En C/C++ los caracteres son secuencias de bits, al igual que cualquier objeto. Pero 'int' es" el tamaño natural sugerido por la arquitectura del entorno de ejecución "(C++ 11 §3.9.1/2). Entonces, el estándar puede definir el término máquina-palabra, pero no el byte de la máquina. 'char' no es ni siquiera la unidad de memoria direccionable más pequeña. Por ejemplo, para definir un uso de 4 bits char 'struct char4 {unsigned int c: 4; } ' –

2

Sólo tenga cuidado con el uso de llano caracteres como índices de matriz.

char buf[10000]; 
fgets(buf, sizeof buf, stdin); 
unsigned charcount[UCHAR_MAX] = {0}; 
char *p = buf; 
while (*p) { 
    charcount[*p]++; /* if (*p < 0) BOOM! */ 
    // charcount[(unsigned char)*p]++; 
    p++; 
} 
1

Vale la pena señalar que char es un tipo distinto de char firmado y char sin signo.

Cuestiones relacionadas