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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top