Wynika to z C na zasady dotyczące liczby całkowitej. Zasadniczo większość zmiennych wchodzących w wyrażenie jest "promowana", więc takie operacje nie tracą precyzji. Następnie jest przekazywana jako int
do printf
, zgodnie z regułami zmiennych argumentów C.
Jeśli tylko chcesz, co szukasz, trzeba oddać z powrotem do unsigned char
:
#include <stdio.h>
int main()
{
unsigned char i=0x80;
printf("%d",((unsigned char)(i<<1)));
return 0;
}
Uwaga: Używanie %c
jak podano w komentarzu Stefana nie zadziała, ponieważ oczekuje %c
również liczba całkowita.
EDIT: Ewentualnie, można to zrobić:
#include <stdio.h>
int main()
{
unsigned char i=0x80;
unsigned char res = i<<1;
printf("%d",res);
return 0;
}
lub
#include <stdio.h>
int main()
{
unsigned char i=0x80;
printf("%d",(i<<1) & 0xFF);
return 0;
}
Nie chcę publikować jako odpowiedzi, ponieważ nie jestem w 100% pewny, ale czy to nie dlatego, że% d jest liczbą całkowitą? Zatem kod za scenami prawdopodobnie przypisuje "i << 1" do liczby całkowitej, aby ją wydrukować, co oznacza, że pasuje i nie przepełnia się. Spróbuj zrobić "printf ("% c ", i << 1);'? – Stephen
@Stephen: Powinien opublikować odpowiedź;) – KevenK
@Stephen: Dane wyjściowe są puste, gdy używam% c. – Variance