Se carbón con o sin signo por defecto?
Pregunta
En el libro "Referencia completa de C" se menciona que char
es por defecto sin firmar.
Pero estoy tratando de verificar esto con GCC, así como Visual Studio. Se lo está tomando como firmó de manera predeterminada.
¿Cuál es la correcta?
Solución
El libro está mal. La norma no especifica si char
llanura está firmada o no.
De hecho, el estándar define tres tipos distintos: char
, signed char
, y unsigned char
. Si #include <limits.h>
y luego mira a CHAR_MIN
, se puede averiguar si char
llano es signed
o unsigned
(si CHAR_MIN
es menor que 0 o igual a 0), pero incluso entonces, el tres tipos son distintos como la medida en que la norma se refiere.
Ten en cuenta que char
es especial de esta manera. Si se declara una variable como int
es 100% equivalente a declarar como signed int
. Esto siempre es cierto para todos los compiladores y arquitecturas.
Otros consejos
Alok señala , la norma deja que hasta la ejecución.
Para gcc, la firma de este defecto, pero se puede modificar con la que -funsigned-char
. Nota: para gcc en Android NDK, el valor predeterminado es sin signo . También puede pedir explícitamente caracteres firmados con -fsigned-char
.
En MSVC, el valor por defecto está firmado, pero se puede modificar con la que /J
.
C99 N1256 proyecto 6.2.5 / 15 "Tipos" tiene esto que decir sobre el-dad firmada de tipo char
:
La aplicación definirá char a tener el mismo rango, la representación y la conducta, ya sea como signed char o unsigned char.
y en una nota al pie:
CHAR_MIN
, definido en<limits.h>
, tendrá uno de los valores o0
SCHAR_MIN
, y esto puede ser utilizado para distinguir las dos opciones. Independientemente de la elección hecha,char
es un tipo separado de los otros dos y no es compatible con cualquiera de los dos.
De acuerdo con The C Programming Language libro de Dennis Ritchie, que es el libro estándar de facto para ANSI C, caracteres sin formato, ya sea con o sin signo son dependiente de la máquina, pero los caracteres imprimibles son siempre positivos.
Según la norma C la de signo de Char llanura es "aplicación definida".
En los ejecutores generales eligieron lo que era más eficiente para implementar en su arquitectura. En los sistemas x86 carbón suele firmarse. En sistemas de brazo por lo general no tiene signo (Apple iOS es una excepción).
Según "The C ++ Programming Language" por Bjarne Stroustrup, char
es "definida por la implementación". Se puede signed char
o unsigned char
dependiendo de la aplicación. Puede comprobar si char
está firmado o no mediante el uso de std::numeric_limits<char>::is_signed
.
Ahora, nosotros conocemos la norma que hasta la implementación.
Pero cómo comprobar un tipo es signed
o unsigned
, como char
?
he escrito una macro para hacer esto:
#define IS_UNSIGNED(t) ((t)~1 > 0)
y probarlo con gcc
, clang
y cl
. Pero no lo sé seguro de que siempre es seguro para los demás casos.