float - ¿Está el carácter firmado o no firmado por defecto?
unsigned char c (6)
En el libro "Referencia completa de C" se menciona que char es por defecto sin signo.
Pero estoy tratando de verificar esto con GCC y con Visual Studio. Lo está tomando como firmado por defecto.
¿Cuál es correcto?
Como señala Alok, el estándar lo deja hasta la implementación.
Para gcc, el valor predeterminado es firmado, pero puede modificarlo con -funsigned-char
. nota: para gcc en Android NDK, el valor predeterminado no está firmado . También puede pedir explícitamente caracteres firmados con -fsigned-char
.
En MSVC, el valor predeterminado es firmado, pero puede modificarlo con /J
De acuerdo con el estándar C, la firma de plain char es "implementación definida".
En general, los implementadores eligieron el que fuera más eficiente para implementar en su arquitectura. En los sistemas x86, el carácter generalmente está firmado. En los sistemas de brazo generalmente no está firmado (Apple iOS es una excepción).
De acuerdo con 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 no, dependen de la máquina, pero los caracteres imprimibles siempre son positivos.
El libro está mal. El estándar no especifica si el char
simple está firmado o no.
De hecho, el estándar define tres tipos distintos: char
, signed char
y unsigned char
. Si #include <limits.h>
y luego mira CHAR_MIN
, puede averiguar si el char
simple está signed
o unsigned
(si CHAR_MIN
es menor que 0 o igual a 0), pero aun así, los tres tipos son distintos hasta ahora como el estándar se refiere.
Según "The C ++ Programming Language" de Bjarne Stroustrup, char
es "implementación definida". Se puede signed char
o unsigned char
dependiendo de la implementación. Puede verificar si char
está firmado o no usando std::numeric_limits<char>::is_signed
.
C99 N1256 borrador 6.2.5 / 15 "Tipos" tiene esto que decir sobre la firma del tipo char
:
La implementación definirá char para tener el mismo rango, representación y comportamiento que el char firmado o el char sin signo.
y en una nota al pie:
CHAR_MIN
, definido en<limits.h>
, tendrá uno de los valores0
oSCHAR_MIN
, y esto se puede usar para distinguir las dos opciones. Independientemente de la elección realizada,char
es un tipo separado de los otros dos y no es compatible con ninguno de los dos.