por isso é sinal-ness de Char não definido em C?
Pergunta
Os C estados padrão:
ISO / IEC 9899: 1999, 6.2.5.15 (. P 49)
Os três tipos de char, char assinado e unsigned char são chamados colectivamente os tipos de caracteres. o implementação deve definir char para tem o mesmo intervalo, representação, e comportamento como seja carvão ou assinado unsigned char.
E, de fato gcc definir que de acordo com plataforma de destino.
A minha pergunta é, por que o padrão de fazer isso? Eu posso ver nada que possa sair da definição do tipo ambígua, com exceção da hedionda e difícil de detectar erros.
Mais do que isso, em ANSI C (antes C99), o único tipo de tamanho de byte é char, portanto, usando carvão para matemática é por vezes inevitável. Assim dizendo "nunca se deve usar carvão para a matemática" não é tão verdadeiro. Se fosse esse o caso, uma decisão mais sã era incluir três tipos "char
, ubyte
, sbyte
".
Existe uma razão para isso, ou é apenas algum estranho pegadinha compatibilidade com versões anteriores, de modo a permitir ruim (mas comum) compiladores a ser definida como padrão compatível?
Solução
"liso" char tendo não especificado assinado ness permite compiladores para seleccionar qualquer representação é mais eficiente para a arquitectura alvo: em algumas arquitecturas, de zero estendendo-se um valor de um byte para o tamanho de "int" requer menos operações (tornando assim Char plain 'unsigned'), enquanto em outros o conjunto de instruções torna mais natural-estendendo sinal, e caractere simples fica implementado como assinado.
Outras dicas
Talvez historicamente algumas implementações 'char' foram assinados e alguns estavam sem sinal, e de modo a ser compatível com ambos não podiam defini-lo como um ou outro.
nos bons velhos tempos C foi definida, o mundo do personagem era 7bit, então o sinal-bit pode ser usado para outras coisas (como EOF)
Em algumas máquinas, um char assinado seria demasiado pequeno para conter todos os caracteres no conjunto de caracteres C (letras, algarismos, pontuação padrão, etc.) Em tais máquinas, 'char' deve ser assinado. Em outras máquinas, um unsigned char pode armazenar valores maiores do que um int assinado (desde de char e int são do mesmo tamanho). Nessas máquinas, 'char' deve ser assinado.
Suponho (fora do topo da minha cabeça) que seu pensamento estava com as seguintes linhas:
Se você se preocupa com o sinal de char (usando-o como um byte), você deve escolher explicitamente assinado ou sem assinatura char.