Eu sou novo em c.
Minha pergunta.
Por que alguns números terminam negativos quando o valor era positivo? Por que alguns números pequenos acabam com uma magnitude enorme quando convertidos para não assinados?
#include <stdio.h>
#include <stdbool.h>
#include <limits.h>
void typecast(int a)
{
unsigned b = (unsigned) a;
unsigned char c = (unsigned char) a;
char d = (char) a;
unsigned long e = (unsigned long) a;
long f = (long) a;
printf(" %d : \n",a);
printf(" ->unsigned int: %u\n",b);
printf(" ->unsigned char (as decimal) %u\n",c);
printf(" ->char (as decimal) %d\n",d);
printf(" ->unsigned long: %lu\n",e);
printf(" ->long: %ld\n",f);
}
int main()
{
int num=0;
printf("Enter an integer: ");
scanf("%d", &num);
typecast(num);
return 0;
}
RESULTADO:
Enter an integer: 1000
1000 :
->unsigned int: 1000
->unsigned char (as decimal) 232
->char (as decimal) -24
->unsigned long: 1000
->long: 1000
Aqui está uma explicação para a saída que você está vendo. 1000 em binário é 1111101000 (10 bits) e é armazenado em um int
(32 bits assinado)
Quando você converte isso para um unsigned char
(que tem 8 bits), os bits superiores são "cortados".
Então você obtém: 11101000
que está 232
em decimal.
Como um caractere (assinado), os bits são interpretados como um número negativo porque o primeiro bit (sinal) é definido, que neste caso é -24.
Ao remover o bit de sinal, 1101000
=104
O "valor" do MSB é 128, então seu computador faz 104 - 128 = -24
.
(Consulte https://en.wikipedia.org/wiki/Two%27s_complement )
Um long tem o mesmo ou mais bits que um int, então o valor não muda.
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras