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?

¿Fue útil?

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 o 0 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.

deja

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top