Jak komputer zapisuje czy zmienna jest signed czy unsigned

1

Wlasnie przeczytalem w kursie xiona o reprezentacji danych w pamieci. W rozdziale o tym jak sie zapisuje liczby ujemne przeczytalem, ze uzywa sie do tego kodu uzupelnien. Najbardziej znaczacy bit ma wartosc -128, pozostale 64, 32, 16, 8, 4, 2 i 1. W ten sposob 10000000 oznacza -128, 00000011 oznacza 3, a np. 11000000 to 64. Bardzo sprytne ale zastanawia mnie jedna rzecz. Mianowicie, w C/C++ mozna oznaczyc zmienna liczbowa jako unsigned i wtedy moge miec wartosc 256. Ale gdzie komputer przechowuje informacje ze 8. bit ma oznaczac 128, a nie 128? Pozdrawiam

0

gdy jest signed. To jeden bit jest przeznaczany na znak (pierwszy) gdy jest unsigned to wszystkie 8 bitów jest traktowane jako liczba. Stąd ta różnica. Poczytaj sobie o reprezentacji danych np tutaj http://www.mimuw.edu.pl/~marpe/arch/akrd.pdf

3

Na poziomie kodu maszynowego nie ma czegoś takiego jak typ danych. Interpretacja zależy zupełnie od używanych instrukcji. Są oddzielne instrukcje maszynowe dla typów singned i unsigned i to od kompilatora zależy, które zostaną użyte w wygenerowanym kodzie.

Przykładem mogą być instrukcje imul (mnoży inty ze znakiem) oraz mul (mnoży inty bez znaku). Jako że, na architekturze x86 do reprezentacji liczb ujemnych używany jest kod uzupełnień do dwójki, nie ma oddzielnych instrukcji iadd i add ponieważ dodawanie przebiega dokładnie tak samo dla liczb ze znakiem jak i bez. :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1