¿El carácter está firmado o no firmado de forma predeterminada?
En el libro "Referencia completa de C" se menciona que, char
por defecto, no está firmado.
Pero estoy intentando verificar esto tanto con GCC como con Visual Studio. Lo toma como firmado por defecto.
¿Cuál es correcto?
El libro está mal. La norma no especifica si el plano char
está firmado o no.
De hecho, la norma define tres tipos distintos: char
, signed char
y unsigned char
. Si #include <limits.h>
luego miras CHAR_MIN
, puedes descubrir si simple char
es signed
o unsigned
(si CHAR_MIN
es menor que 0 o igual a 0), pero aun así, los tres tipos son distintos en lo que respecta al estándar.
Tenga en cuenta que char
es especial en este sentido. Si declara una variable como int
es 100% equivalente a declararla como signed int
. Esto siempre es cierto para todos los compiladores y arquitecturas.
Como señala Alok , el estándar deja eso en manos de la implementación.
Para gcc, el valor predeterminado está firmado, pero puedes modificarlo con -funsigned-char
. nota: para gcc en Android NDK, el valor predeterminado es unsigned . También puedes solicitar explícitamente caracteres firmados con -fsigned-char
.
En MSVC, el valor predeterminado está firmado, pero puede modificarlo con /J
.
C99 N1256 borrador 6.2.5/15 "Tipos" tiene esto que decir sobre la firma del tipo char
:
La implementación definirá char para que tenga el mismo rango, representación y comportamiento que el char firmado o el char sin firmar.
y en una nota a pie de página:
CHAR_MIN
, definido en<limits.h>
, tendrá uno de los valores0
oSCHAR_MIN
, y esto puede usarse para distinguir las dos opciones. Independientemente de la elección realizada,char
es un tipo independiente de los otros dos y no es compatible con ninguno de los dos.
Según el libro The C Programming Language de Dennis Ritchie, que es el libro estándar de facto para ANSI C, los caracteres simples, ya sean firmados o sin firmar, dependen de la máquina, pero los caracteres imprimibles siempre son positivos.