2012-06-05 25 views
5

Uzupełnienia dwóch zestawów ułatwiają komputerowi obliczenie odjęcia dwóch liczb. Ale w jaki sposób komputer rozróżnia liczbę całkowitą, jest liczbą całkowitą lub całkowitą bez znaku? To tylko 0 i 1 w jego pamięci.W jaki sposób komputer rozróżnia liczbę całkowitą jest podpisany lub niepodpisany?

Dla przykładu, 1111 1111 w pamięci komputera może reprezentować liczbę 255, ale może również reprezentować -1.

+0

patrz http://en.wikipedia.org/wiki/Signedness i http://en.wikipedia.org/wiki/Opisane_numer_reprezentacji – mtijn

+0

Nie pytam, w jaki sposób podpisany numer reprezentowany w komputerze – viperchaos

+0

przeczytałeś spinki do mankietów? zostały opublikowane, ponieważ są istotne dla twojego pytania – mtijn

Odpowiedz

10

Podpisane i niepodpisane używają tych samych danych, ale różnych instrukcji.

Komputer przechowuje liczby całkowite z podpisem i bez znaku jako te same dane. To znaczy. 255 i -1 są tymi samymi bitami. Jednakże informujesz kompilator, jaki typ ma ta zmienna. Jeśli jest podpisany, kompilator używa podpisanych operatorów do manipulowania zmiennymi (np. IDIV), a gdy jest niepodpisany, używa innej instrukcji (na przykład DIV). Tak więc kompilator tworzy program, który mówi procesorowi, jak interpretować dane.

+1

Warto zauważyć, że w przypadku większości procesorów instrukcja różni się tylko w przypadku mnożenia (MUL/IMUL dla IA32) i podziału (DIV/IDIV) ([instrukcja referencyjna] (http: //www.posix.nl/linuxassembly/nasmdochtml/nasmdoca.html)). Sprytna rzecz w uzupełnieniu do 2 jest tak naprawdę nie jest tak, że łatwiej odjąć, ale to dodanie (ADD) nie obchodzi, czy liczby są podpisane lub niepodpisane. Z tego powodu odejmowanie jest rzeczywiście łatwiejsze, ponieważ w celu odjęcia można łatwo obliczyć uzupełnienie 2 do odretniania i dodać je do minuendy. –

2

Nie rozróżnia ich. Ale z dopełnieniem obliczenia są takie same:

Poniżej d zostanie dodany do liczb dziesiętnych, a b do liczb binarnych. Obliczenia będą na liczbach 8 bitowych.

-1d + 1d = 1111 1111b + 1b = 1 0000 0000b

Ale ponieważ mamy przepełnienie (tak, to 8 0 s oraz 1 na A 8 bitowych liczb całkowitych), wynik jest równy 0.

-2d + 1d = 1111 1110b + 1b = 1111 1111b = -1d

-1d + 2d = 1111 1111b + 10b = 1 0000 0001b (this overflows) = 1b = 1d

-1d + -1d = 1111 1111b + 1111 1111b = 1 1111 1110b (this overflows) = 1111 1110b = -2d

A jeśli wziąć pod uwagę te operacje na niepodpisanych (wartości binarnych będzie bez zmian):

255d + 1d = 1111 1111b + 1b = 1 0000 0000b (this overflows) = 0d

254d + 1d = 1111 1110b + 1b = 1111 1111b = 255d

255d + 2d = 1111 1111b + 10b = 1 0000 0001b (this overflows) = 1b = 1d

255d + 255d = 1111 1111b + 1111 1111b = 1 1111 1110b (this overflows) = 1111 1110b = 2d

Niepodpisana kontra podpisany jest więc tylko wizualna reprezentacja Niepodpisany, używany tylko podczas wyświetlania człowiekowi :-)