Conversões de tipos integrais não assinados
Um inteiro sem sinal é convertido em um inteiro com ou sem sinal mais curto por meio do truncamento dos bits de ordem superior; ou é convertido em um inteiro com ou sem sinal mais longo por meio da extensão de zero (consulte a tabela de conversões de tipos integrais sem sinal).
Quando o valor com tipo integral é rebaixado para um inteiro com sinal de tamanho menor, ou um inteiro sem sinal é convertido no inteiro com sinal correspondente, o valor não será alterado se ele puder ser representado no novo tipo. No entanto, o valor que ele representa mudará se o bit de sinal for definido, como no exemplo a seguir.
int j;
unsigned short k = 65533;
j = k;
printf_s( "%hd\n", j ); // Prints -3
Se ele não puder ser representado, o resultado será definido na implementação. Consulte o tópico sobre conversões de tipos (estilo cast) para obter informações sobre como o compilador de C da Microsoft manipula o rebaixamento de números inteiros. O mesmo comportamento resulta da conversão regular do inteiro ou da conversão de tipo ("cast") do inteiro.
Os valores sem sinal são convertidos de uma maneira que preserva o valor e não pode ser representada diretamente em C. A única exceção é uma conversão de unsigned long em float, que perde, no máximo, os bits de ordem inferior. Caso contrário, o valor é preservado, com ou sem sinal. Quando um valor de tipo integral é convertido em flutuante e está fora do intervalo representável, o resultado é indefinido. (Consulte Armazenamento de tipos básicos para obter informações sobre o intervalo para os tipos integral e de ponto flutuante.)
A tabela a seguir resume as conversões de tipos integrais sem sinal.
Conversões de tipos integrais sem sinal
De |
Para |
Método |
---|---|---|
unsigned char |
char |
Preserva o padrão de bits; o bit de ordem superior torna-se o bit de sinal |
unsigned char |
short |
Extensão de zero |
unsigned char |
long |
Extensão de zero |
unsigned char |
unsigned short |
Extensão de zero |
unsigned char |
unsigned long |
Extensão de zero |
unsigned char |
float |
Converte em long; converte long em float |
unsigned char |
double |
Converte em long; converte long em double |
unsigned char |
long double |
Converte em long; converte long em double |
unsigned short |
char |
Preserva o byte de ordem inferior |
unsigned short |
short |
Preserva o padrão de bits; o bit de ordem superior torna-se o bit de sinal |
unsigned short |
long |
Extensão de zero |
unsigned short |
unsigned char |
Preserva o byte de ordem inferior |
unsigned short |
unsigned long |
Extensão de zero |
unsigned short |
float |
Converte em long; converte long em float |
unsigned short |
double |
Converte em long; converte long em double |
unsigned short |
long double |
Converte em long; converte long em double |
unsigned long |
char |
Preserva o byte de ordem inferior |
unsigned long |
short |
Preserva a palavra de ordem inferior |
unsigned long |
long |
Preserva o padrão de bits; o bit de ordem superior torna-se o bit de sinal |
unsigned long |
unsigned char |
Preserva o byte de ordem inferior |
unsigned long |
unsigned short |
Preserva a palavra de ordem inferior |
unsigned long |
float |
Converte em long; converte long em float |
unsigned long |
double |
Converte diretamente em double |
unsigned long |
long double |
Converte em long; converte long em double |
Específico da Microsoft
Para o compilador de C de 32 bits da Microsoft, o tipo unsigned int é equivalente ao tipo unsigned long. A conversão de um valor unsigned int é realizada da mesma maneira que a conversão de um unsigned long. As conversões de valores unsigned long em float não serão precisas se o valor que estiver sendo convertido for maior do que o valor long positivo máximo com sinal.
FIM de Específico da Microsoft