2013-04-08 14 views
5

muszę analizować dane wyjściowe tych fragmentów kodu:Praktyczna różnica między int i char

int x, y; 
x = 200; y = 100; 
x = x+y; y = x-y; x = x-y; 
printf ("%d %d\n", x, y); 

char x, y; 
x = 200; y = 100; 
x = x+y; y = x-y; x = x-y; 
printf ("%d %d\n", x, y); 

Tak, wiem, że int Stojaki do liczby całkowitej i char o charakterze; Przeczytałem o różnicach i jeśli wstawię printf%d, zwróci on w formie cyfr i %c, w postaci znaku.

Kod znaków ASCII dla 'A' wynosi na przykład 65, ale dlaczego druga funkcja drukuje 100 -56, zamiast 100 200?

+0

Twój 'char' nie jest podpisany przez domyślny. W ten sposób się otacza. –

+3

Symbol C ma 8 bitów, więc 127 jest największą liczbą dodatnią, jaką możesz mieć. –

+1

Aby opracować, może być podpisane lub niepodpisane, a który 'char' sam jest różny w zależności od implementacji. Musisz użyć określonego typu, jeśli chcesz tego przy każdej implementacji. Inne typy, takie jak "int", domyślnie "podpisane". – chris

Odpowiedz

6

Na platformie użytej w pytaniu typ char wydaje się mieć rozmiar 1 bajta (8 bitów) i jest typem podpisu z bitem 1 znaku i 7 bitami wartości (oraz z arytmetyczną uzupełnieniami 2). Przechowuje wartości od -128 do 127. Tak więc, to co się dzieje z x i y:

x = 200 => x takes value -56 
y = 100 => y takes value 100 
x = x+y => x takes value 44 
y = x-y => y takes value -56 
x = x-y => x takes value 100 
+0

Dlaczego nie -127 do 128? Przy okazji, dziękuję za wyjaśnienie, ma sens teraz. – Souza

+0

@Souza, Użyj lewego lewego bitu jako bitu znaku i nadal dodawaj 1 na papierze. To nie jest gwarantowane przez C (tylko zakres [-127,127] jest gwarantowany dla 'signed char'), ale to jest to, co jest dzisiaj bardzo popularne. Termin, którego należy szukać, jest uzupełnieniem dwójki. – chris

+4

znaki nie muszą mieć 8 bitów, nie muszą być podpisane. Byłoby lepiej, gdyby twoja odpowiedź była poprzedzona prefiksem "Podobno w używanym środowisku C ..." –

8

C ma szereg rodzajów: char całkowitą (co najmniej 8 bitów), short (co najmniej 16 bitów), int (co najmniej 16 bitów), long (co najmniej 32 bitów). Istnieje unsigned ich odmian. Jeśli przypiszesz wartość, która jest zbyt duża dla zwykłego typu, wyniki są niezdefiniowane (nigdy nie powinieneś tego robić, kompilator może założyć, że nigdy tego nie robisz, a nie sprawdzać w ogóle). W przypadku unsigned "zawijają się". Należy jednak pamiętać, że rozmiary są nie gwarantowane, tylko ich minimalne rozmiary. Były maszyny, w których wszystkie miały szerokość 32 bitów.

+0

@chris To nie ma nic wspólnego z tą odpowiedzią. 'Char' może mieć szerokość 32 bitów, a' sizeof (char) 'jest * wciąż * 1. –

+0

@JimBalter, tak, właśnie o tym myślałem. Mimo że wiem, że to nieprawda, mój umysł przyspieszył, by jeden bajt miał osiem bitów. – chris

Powiązane problemy