¿El carácter está firmado o no firmado de forma predeterminada?

5 minutos de lectura

avatar de usuario
Aprendiz C

En el libro “Referencia completa de C” se menciona que char está por defecto sin firmar.

Pero estoy tratando de verificar esto con GCC y Visual Studio. lo está tomando como firmado por defecto.

¿Cuál es el correcto?

  • El único libro de referencia de C en el que confío es “C: A Reference Manual” de Harbison & Steele (careferencemanual.com). Por supuesto, el estándar es la última palabra, pero no es muy legible y solo brinda la más mínima información sobre usos previos al estándar y comunes (es decir, POSIX) que están fuera del estándar. Harbison & Steele es bastante legible, detallado y probablemente más correcto que la mayoría de las referencias. Sin embargo, tampoco es un tutorial, por lo que si está en las etapas iniciales de aprendizaje, probablemente no sea una gran cosa para comenzar.

    – Michael Burr

    13 de enero de 2010 a las 7:02

  • Creo que el libro que estás leyendo es C: La referencia completa, de Herbert Schildt. De una reseña de este libro (accu.informika.ru/accu/bookreviews/public/reviews/c/c002173.htm): No voy a recomendar este libro (muchos de ustedes dan demasiado peso a mis opiniones), pero no creo que merezca el mismo oprobio que legítimamente se ha arrojado sobre algunos de sus otros trabajos. Como dice Michael, una referencia mucho mejor es Harbison y Steele.

    – Alok Singhal

    13 de enero de 2010 a las 7:14


  • Mis dos centavos aquí: porque char puede estar sin firmar, como regla general, use un int para leer un valor usando getchar()que podría volver EOF. EOF generalmente se define como -1 u otro valor negativo, que almacenar en un unsigned no es lo que quieres. Aquí está la declaración: extern int getchar(); Por cierto, esta recomendación también proviene del libro “C: A Reference Manual”.

    – Maxim Chetrusca

    3 de noviembre de 2014 a las 15:39

  • La única referencia de C en la que confío es ISO/IEC 9899:2011 🙂

    –Jeff Hammond

    06/04/2015 a las 22:31

  • @MaxChetrusca buen consejo pero mala justificación: incluso en el firmado char caso, tendrías que usar int para almacenar el valor de retorno.

    – Antti Haapala — Слава Україні

    12 de febrero de 2016 a las 8:21


De acuerdo con el estándar C, el carácter firmado del carácter simple está “definido por la implementación”.

En general, los implementadores eligieron el que fuera más eficiente para implementar en su arquitectura. En los sistemas x86, char generalmente está firmado. En los sistemas de brazo, generalmente no está firmado (Apple iOS es una excepción).

  • ¿Por qué los tipos sin firmar son más eficientes en ARM? ¿Está char firmado o sin firmar de forma predeterminada en iOS?

    – phuclv

    16 de mayo de 2017 a las 8:38


  • @plugwash Su respuesta probablemente fue rechazada porque Tim Post perdió sus llaves. Hablando en serio, no debe preocuparse por un solo voto negativo siempre que esté seguro de que su respuesta es correcta (que lo es en este caso). Me ha pasado varias veces que mis publicaciones han sido votadas negativamente sin ninguna razón válida. No te preocupes por eso, a veces la gente simplemente hace cosas raras.

    – Pato Donald

    2 oct 2017 a las 10:54


  • ¿Por qué el carácter firmado es más eficiente en x86? ¿Alguna fuente?

    – martinkunev

    12 de marzo de 2019 a las 17:48

  • @martinkunev Necropost pero: no creo que el carácter firmado sea más eficiente como tal en x86, pero tampoco es menos eficiente que el no firmado. Las razones para elegirlo también pueden incluir la coherencia con otros tipos de enteros que se establecen de forma predeterminada en firmados, y tal vez los tipos firmados a veces conducen a una mejor optimización debido a que el desbordamiento firmado es un comportamiento indefinido (es decir, el compilador puede suponer que no se desbordará).

    – Arkku

    25 de noviembre de 2021 a las 17:58

  • Es interesante que la descripción de Schildt no coincida con el comportamiento de MSVC, ya que sus libros suelen estar dirigidos a los usuarios de MSVC. Me pregunto si MS cambió el valor predeterminado en algún momento.

    – Michael Burr

    13 de enero de 2010 a las 7:17

  • Pensé que no dependía del compilador, sino de la plataforma. Pensé que char se dejó como un tercer tipo de “tipo de datos de carácter” para ajustarse a lo que los sistemas en ese momento usaban como caracteres imprimibles.

    – arácnido

    9 mayo 2012 a las 19:45

  • documentos de GCC decir que depende de la máquina: “Cada tipo de máquina tiene un valor predeterminado para lo que debe ser char. Es como un carácter sin firmar de forma predeterminada o como un carácter firmado de forma predeterminada.

    – Deduplicador

    7 sep 2015 a las 16:16


  • ¿Puede proporcionar una fuente para su nota de que en Android el valor predeterminado es el carácter sin firmar?

    – plipsy

    22 de octubre de 2015 a las 6:36

  • @Spidey, el estándar C, no hace una distinción real entre compiladores, plataformas y arquitecturas de CPU. Simplemente los agrupa a todos bajo “implementación”.

    – lavado de enchufe

    23 de noviembre de 2016 a las 18:48

avatar de usuario
miguel rebabas

Proyecto C99 N1256 6.2.5/15 “Tipos” tiene esto que decir acerca de 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 al pie:

CHAR_MINdefinido en <limits.h>tendrá uno de los valores 0 o SCHAR_MIN, y esto se puede utilizar para distinguir las dos opciones. Independientemente de la elección que se haga, char es un tipo separado de los otros dos y no es compatible con ninguno.

avatar de usuario
南山竹

Ahora, sabemos que el estándar deja eso en manos de la implementación.

Pero cómo comprobar un tipo es signed o unsignedcomo char?

Escribí una macro para hacer esto:

#define IS_UNSIGNED

y probarlo con gcc, clangy cl. Pero no estoy seguro de que siempre sea seguro para otros casos.

avatar de usuario
llamada estándar

Según el libro El lenguaje de programación C de Dennis Ritchie, que es el libro estándar de facto para ANSI C, los caracteres simples, ya sea con o sin firma, dependen de la máquina, pero los caracteres imprimibles siempre son positivos.

  • No es necesariamente el caso que imprimible Los personajes son siempre positivos. El estándar C garantiza que todos los miembros del conjunto de caracteres de ejecución básica tengan valores no negativos.

    –Keith Thompson

    1 de abril de 2014 a las 4:40

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad