2012-03-01 17 views
10

Biorę kurs organizacji komputerowej i asembler. Pisemna część naszego laboratorium w tym tygodniu ma pytanie, które mnie zaskoczyło. Pytanie brzmi:Odejmowanie dużej niepodpisanej liczby binarnej od mniejszej

Odejmij następujące niepodpisane liczby binarne (pokaż bity pożyczkowe i przelewowe). Nie zamieniaj się na dopełnienie dwójki.

0101 0111 1101 
-1110 1011 0110 
-------------- 

Zdaję sobie sprawę, że odpowiedź jest -1001 0011 1001 ale mam twardy czas próbuje dowiedzieć się, jak pożyczyć faktycznie wykonać tę odejmowanie przez poświęcenie większej ilości i odejmując je od mniejsza liczba i pokaż moją pracę. Całe życie, odejmując dużą liczbę od małej liczby, odwróciłem problem i zamiast tego odrzuciłem mniejszą liczbę z większej liczby i dodałem ujemny znak przed wynikiem. Zapytałem profesora i powiedział, że chce rozwiązać problem w taki sposób, w jaki jest napisany. Nie mogę tego rozwiązać, odejmując mniejszą liczbę od większej liczby i negując jak zwykle. Nie udało mi się znaleźć żadnych przykładów online odejmujących większą niepodpisaną liczbę binarną od mniejszej.

Byłbym bardzo wdzięczny, gdyby ktoś mógł opisać mi, jak wykonać odejmowanie w tym scenariuszu.

Aktualizacja: @Alex jest poprawny. Profesor szukał

0110 1100 0111 (1735) 

Dziękuję wszystkim.

+2

Czy jesteś pewien, że nie chce "0110 1100 0111" ze wskazaniem niektórych pożyczonych bitów i bitu przelewowego? – Beta

+0

@ Beta: Nie, odpowiedź brzmi "-1001 0011 1001" (-2361). Pracuje tylko z normalnymi liczbami binarnymi, a nie z określoną reprezentacją komputerową, taką jak uzupełnienie 2-skie. –

+0

Nie jestem pewien, czy profesor był po -1001 0011 1001 (-2361) lub 0110 1100 0111 (1735), skończyłem z 1735. Myślę, że @ Beta ma rację. Odpowiem z tym, czego szukał, gdy laboratorium zostanie przekazane. –

Odpowiedz

7

Robisz to w ten sam sposób, niezależnie od tego, która liczba jest większa, a która mniejsza.

bb b  bb <- borrows 
0101 0111 1101 (1405) 
-1110 1011 0110 (3766) 
-------------- 
0110 1100 0111 (1735?) 

Teraz, jeśli chcesz odpowiednią różnicę, trzeba wziąć pod uwagę przepełnienie ponieważ powyższy wynik nie zawiera bit znaku:

b bb b  bb <- borrows 
0 0101 0111 1101 (1405) 
-0 1110 1011 0110 (3766) 
---------------- 
1 0110 1100 0111 (-2361 signed 2's complement) 

Naprawdę, CPU nie troszczcie się, co odejmuje się od czego. Używa tego samego algorytmu do dodawania/odejmowania liczb całkowitych, ponadto ten algorytm jest taki sam dla podpisanych i bez znaku liczb całkowitych. Musisz tylko poprawnie interpretować wyniki i flagi carry i overflow. To wszystko.

+1

-1 konkretnie powiedział, że nie pracuje w uzupełnieniu 2-go –

+0

Dzięki Alex. Podejrzewam, że twoim najlepszym przykładem jest profesor. To właśnie otrzymywałem, próbując rozwiązać problem. Myślę, że to mogło być sedno problemu ... pokazać, że odejmowanie nie daje właściwego wyniku w tym scenariuszu. Myślę, że właśnie podchodziłem do problemu z błędnego nastawienia. –

+0

@ BlueRaja-DannyPflughoeft: Powiedział: "Nie zamieniaj się w dopełnienie dwójki". i niczego nie konwertowałem. –

-1

po prostu odejmij dwie liczby binarne w takiej postaci, w jakiej się znajdują, a następnie uzupełnij wynik o 2. voila!

Powiązane problemy