c++ - titulo - title tag e title heading




O que é um caracter não assinado? (11)

Em C / C ++, para que um unsigned char é usado? Como isso é diferente de um char regular?


Alguns googling acharam this , onde as pessoas discutiam sobre isso.

Um caracter não assinado é basicamente um único byte. Então, você usaria isso se você precisar de um byte de dados (por exemplo, talvez você queira usá-lo para configurar os sinalizadores on e off para serem passados ​​para uma função, como geralmente é feito na API do Windows).


Char não assinado é o coração de todo truque de bits. Em quase todos os compiladores para a plataforma ALL, um caractere não assinado é simplesmente um BYTE. Um inteiro sem sinal de (normalmente) 8 bits. que pode ser tratado como um inteiro pequeno ou um pacote de bits.

Além disso, como alguém disse, o padrão não define o sinal de um char. então você tem 3 tipos distintos de "char": char, signed char, unsigned char.


Em C ++, existem três tipos de caracteres distintos :

  • char
  • signed char
  • unsigned char

Se você estiver usando tipos de caracteres para texto , use o char não qualificado:

  • é o tipo de literais de caracteres como 'a' ou '0' .
  • é o tipo que compõe strings C como "abcde"

Ele também funciona como um valor numérico, mas não é especificado se esse valor é tratado como assinado ou não assinado. Cuidado com comparações de personagens através de desigualdades - embora se você se limitar a ASCII (0-127), você está quase seguro.

Se você estiver usando tipos de caracteres como números , use:

  • signed char , que lhe dá pelo menos o intervalo de -127 a 127. (-128 a 127 é comum)
  • unsigned char , que lhe dá pelo menos o intervalo de 0 a 255.

"Pelo menos", porque o padrão C ++ fornece apenas o intervalo mínimo de valores que cada tipo numérico é necessário para cobrir. sizeof (char) é necessário para ser 1 (ou seja, um byte), mas um byte poderia, em teoria, ser por exemplo 32 bits. sizeof ainda reportaria seu tamanho como 1 - significando que você poderia ter sizeof (char) == sizeof (long) == 1 .


Em termos de valores diretos, um caractere regular é usado quando os valores são conhecidos entre CHAR_MIN e CHAR_MAX enquanto um caractere não assinado fornece o dobro do intervalo no final positivo. Por exemplo, se CHAR_BIT for 8, o intervalo de char regulares será garantido como [0, 127] (porque pode ser assinado ou não assinado) enquanto unsigned char será [0, 255] e o signed char será [-127] 127].

Em termos do que é usado, os padrões permitem que objetos de POD (plain old data) sejam convertidos diretamente em um array de char não assinado. Isso permite examinar a representação e os padrões de bits do objeto. A mesma garantia de punting tipo seguro não existe para char ou char assinado.


O caractere unsigned usa somente valores positivos: 0 a 255 caracteres assinados recebem valores positivos e negativos: -128 a +127


Porque eu sinto que é realmente chamado, eu só quero declarar algumas regras de C e C ++ (eles são os mesmos a este respeito). Primeiro, todos os bits de unsigned char participam da determinação do valor se algum objeto char não assinado. Em segundo lugar, o unsigned char é explicitamente declarado como não assinado.

Agora, eu tive uma discussão com alguém sobre o que acontece quando você converte o valor -1 do tipo int para unsigned char . Ele recusou a idéia de que o unsigned char resultante tenha todos os bits definidos como 1, porque estava preocupado com a representação de sinais. Mas ele não precisa. É imediatamente após esta regra que a conversão faz o que é pretendido:

Se o novo tipo não estiver assinado, o valor será convertido, adicionando ou subtraindo repetidamente um a mais que o valor máximo que pode ser representado no novo tipo até que o valor esteja no intervalo do novo tipo. ( 6.3.1.3p2 em um rascunho C99)

Essa é uma descrição matemática. C ++ descreve-o em termos de módulo de cálculo, que produz a mesma regra. De qualquer forma, o que não é garantido é que todos os bits no inteiro -1 são um antes da conversão. Então, o que temos para que possamos afirmar que o unsigned char resultante tem todos os seus bits CHAR_BIT voltados para 1?

  1. Todos os bits participam na determinação de seu valor - ou seja, nenhum bit de preenchimento ocorre no objeto.
  2. Adicionar apenas uma vez UCHAR_MAX+1 a -1 resultará em um valor no intervalo, ou seja, UCHAR_MAX

Isso é o suficiente, na verdade! Então, sempre que você quiser ter um unsigned char tenha todos os bits um, faça

unsigned char c = (unsigned char)-1;

Segue-se também que uma conversão não está apenas truncando bits de ordem superior. O evento afortunado para o complemento de dois é que é apenas um truncamento, mas o mesmo não é necessariamente verdade para outras representações de sinais.


Se você quiser usar um caractere como um inteiro pequeno, a maneira mais segura de fazer isso é com os tipos uint8_t e uint8_t .


Um caracter não assinado é um valor de byte (não assinado) (0 a 255). Você pode estar pensando em "char" em termos de ser um "personagem", mas é realmente um valor numérico. O "char" regular é assinado, portanto, você tem 128 valores e esses valores são mapeados para caracteres usando a codificação ASCII. Mas em ambos os casos, o que você está armazenando na memória é um valor de byte.


citado frome "o livro de programação c":

O qualificador signed ou unsigned pode ser aplicado a char ou a qualquer inteiro. números não assinados são sempre positivos ou nulos, e obedecem às leis do módulo aritmético 2 ^ n, onde n é o número de bits no tipo. Portanto, por exemplo, se chars são 8 bits, variáveis ​​char não assinadas têm valores entre 0 e 255, enquanto chars assinados têm valores entre -128 e 127 (em uma máquina de complemento de dois). Se caracteres simples são assinados ou não assinados é máquina -dependente, mas os caracteres imprimíveis são sempre positivos.


char e unsigned char não são garantidos como tipos de 8 bits em todas as plataformas - eles têm garantia de 8 bits ou mais. Algumas plataformas possuem bytes de 9 bits, 32 bits ou 64 bits . No entanto, as plataformas mais comuns hoje em dia (Windows, Mac, Linux x86, etc.) têm bytes de 8 bits.


unsigned char leva apenas valores positivos .... como 0 a 255

enquanto que

signed char leva valores positivos e negativos .... como -128 a +127







char