Thread View: pl.comp.lang.asm
9 messages
9 total messages
Started by Johnny
Fri, 17 Nov 2006 08:21
Operacje ze znakiem i bez znaku
Author: Johnny
Date: Fri, 17 Nov 2006 08:21
Date: Fri, 17 Nov 2006 08:21
18 lines
1480 bytes
1480 bytes
Frapuje mnie coś takiego: Wiele operacji np. mnożenie i czy skoki warunkowe mają różne wersje w zależności od tego czy dotyczą liczb ze znakiem czy bez znaku. Załóżmy, że użytkownik ma wprowadzić dwie liczby całkowite. Nie wiemy czy to będą liczby dodatnie czy ujemne. Chcemy je przemnożyć lub porównać. Czy wpierw należy ustalić znak liczb i gdy przynajmniej jedna z nich będzie ujemna skoczyć do sekcji z operacjami na liczbach ze znakiem lub jeśli obie będą dodatnie do sekcji z operacjami do liczb dodatnich (bez znaku)? -- Pozdrawiam Johnny "Zauważyłem że ci wszyscy, którzy opowiadają się za aborcją, zdążyli się urodzić". R. Reagan
Re: Operacje ze znakiem i bez znaku
Author: Bogdan (bogdro)
Date: Fri, 17 Nov 2006 08:46
Date: Fri, 17 Nov 2006 08:46
26 lines
2299 bytes
2299 bytes
Johnny napisał(a): > Frapuje mnie coś takiego: > > Wiele operacji np. mnożenie i czy skoki warunkowe mają różne wersje w > zależności od tego czy dotyczą liczb ze znakiem czy bez znaku. > > Załóżmy, że użytkownik ma wprowadzić dwie liczby całkowite. Nie wiemy > czy to będą liczby dodatnie czy ujemne. Chcemy je przemnożyć lub > porównać. Czy wpierw należy ustalić znak liczb i gdy przynajmniej jedna > z nich będzie ujemna skoczyć do sekcji z operacjami na liczbach ze > znakiem lub jeśli obie będą dodatnie do sekcji z operacjami do liczb > dodatnich (bez znaku)? Wykonuj operacje biorące pod uwagę znak liczby. Po wpisaniu liczby nie odróżnisz, czy użytkownik podał 129 czy -127 (przykład dla bajtu). Nawet jeśli czasie wpisywania liczb trzymasz jakąś flagę mówiącą, czy wpisano minus, czy nie, to wiecznie złośliwy użytkownik wpisze ci -20 i 130, a program stwierdzi, że obie są ujemne. Najlepiej już w czasie wpisywania ograniczać dostępne cyfry - wtedy można też sprawdzać, czy podano minus, rozgałęzić kod i wszystko będzie dobrze. -- Pozdrawiam, Bogdan (Linux i FreeDOS) Kurs assemblera x86 (DOS i Linuks): http://rudy.mif.pg.gda.pl/~bogdro Grupy dyskusyjne o asm: pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32 Rozmawiaj bezpiecznie: www.JabberPL.org Surfuj anonimowo: tor.eff.org
Re: Operacje ze znakiem i bez znaku
Author: Johnny
Date: Fri, 17 Nov 2006 10:38
Date: Fri, 17 Nov 2006 10:38
20 lines
1557 bytes
1557 bytes
Bogdan (bogdro) napisał(a): > Wykonuj operacje biorące pod uwagę znak liczby. (...) > Najlepiej już w czasie > wpisywania ograniczać dostępne cyfry - wtedy można też sprawdzać, czy > podano minus, rozgałęzić kod i wszystko będzie dobrze. > Nie do końca zrozumiałem Twoją intencję: zawsze stosować operacje dla liczb ze znakiem czy też jednak rozgałęziać kod? Czy taki imul lub skok warunkowy dla porównań ze znakiem w odniesieniu do dodatnich liczb zadziała prawidłowo? -- Pozdrawiam Johnny "Zauważyłem że ci wszyscy, którzy opowiadają się za aborcją, zdążyli się urodzić". R. Reagan
Re: Operacje ze znakiem i bez znaku
Author: Matuzalem
Date: Fri, 17 Nov 2006 13:14
Date: Fri, 17 Nov 2006 13:14
26 lines
2410 bytes
2410 bytes
Johnny napisał(a): > Bogdan (bogdro) napisał(a): > > Wykonuj operacje biorące pod uwagę znak liczby. > (...) > > Najlepiej już w czasie > > wpisywania ograniczać dostępne cyfry - wtedy można też sprawdzać, czy > > podano minus, rozgałęzić kod i wszystko będzie dobrze. > > > > Nie do końca zrozumiałem Twoją intencję: zawsze stosować operacje dla > liczb ze znakiem czy też jednak rozgałęziać kod? Czy taki imul lub skok > warunkowy dla porównań ze znakiem w odniesieniu do dodatnich liczb > zadziała prawidłowo? Bogdanowi chodziło o to, aby w trakcie wprowadzania danych "zabronić" wpisywać pewnych znaków np. "-", lub też wykrywać je. Jeśli będziesz domyślnie używał działań ze znakiem, to ograniczasz się do "mniejszych" liczb, co w przypadku liczb >= 0 nie ma zupełnie sensu. Po drugie - tak jak pisał Bogdan - tak czy siak musisz sprawdzić dane na input bo nie wiesz co zrobi użytkownik/inny program i może wykonać czynność której nie przewidziałeś - a co jeśli zamiast liczb wpisze znaki? przerobisz je na odpowiedniki ASCII i np. dodasz...? :] Zawsze sprawdzaj co zostaje wprowadzone do programu. Pozdrawiam
Re: Operacje ze znakiem i bez znaku
Author: Johnny
Date: Fri, 17 Nov 2006 14:23
Date: Fri, 17 Nov 2006 14:23
15 lines
1620 bytes
1620 bytes
Rozumiem ideę związaną ze sprawdzaniem danych wejściowych - to jest dla mnie jasne. Chodzi mi o praktykę w sytuacji gdy użytkownik ma prawo wprowadzić albo ujemną liczbę albo dodatnią. Tego nie wiemy. Jaka jest praktyka? Czy: - sprawdza się występowanie znaku minus i skacze do operacji przeznaczonych dla liczb ujemnych/ dodatnich - nie sprawdza się znaku liczby gdyż stosuje się tylko operacje przeznaczone dla liczb ujemnych -- Pozdrawiam Johnny "Zauważyłem że ci wszyscy, którzy opowiadają się za aborcją, zdążyli się urodzić". R. Reagan
Re: Operacje ze znakiem i bez znaku
Author: Bogdan (bogdro)
Date: Fri, 17 Nov 2006 14:40
Date: Fri, 17 Nov 2006 14:40
24 lines
2208 bytes
2208 bytes
Johnny napisał(a): > Rozumiem ideę związaną ze sprawdzaniem danych wejściowych - to jest dla > mnie jasne. Chodzi mi o praktykę w sytuacji gdy użytkownik ma prawo > wprowadzić albo ujemną liczbę albo dodatnią. Tego nie wiemy. Jaka jest > praktyka? Czy: > - sprawdza się występowanie znaku minus i skacze do operacji > przeznaczonych dla liczb ujemnych/ dodatnich Tak chyba będzie lepiej. W czasie wczytywania liczb należy jednak przy okazji zadbać, by nie wykroczyły z określonego przedziału (tzn. aby nie można było wpisać więcej niż 127 czy mniej niż -128 dla bajtu). > - nie sprawdza się znaku liczby gdyż stosuje się tylko operacje > przeznaczone dla liczb ujemnych Jeśli jesteś w stanie zagwarantować poprawność danych (a kiedy można?), to to rozwiązanie jest prostsze. Ale przypominam przykład z +130 i -20. -- Pozdrawiam, Bogdan (Linux i FreeDOS) Kurs assemblera x86 (DOS i Linuks): http://rudy.mif.pg.gda.pl/~bogdro Grupy dyskusyjne o asm: pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32 Rozmawiaj bezpiecznie: www.JabberPL.org Surfuj anonimowo: tor.eff.org
Re: Operacje ze znakiem i bez znaku
Author: Johnny
Date: Fri, 17 Nov 2006 15:01
Date: Fri, 17 Nov 2006 15:01
9 lines
1253 bytes
1253 bytes
Dzięki. -- Pozdrawiam Johnny "Zauważyłem że ci wszyscy, którzy opowiadają się za aborcją, zdążyli się urodzić". R. Reagan
Re: Operacje ze znakiem i bez znaku
Author: Bernard
Date: Sat, 18 Nov 2006 09:50
Date: Sat, 18 Nov 2006 09:50
24 lines
2329 bytes
2329 bytes
Bogdan (bogdro) wrote: > Johnny napisał(a): >> Rozumiem ideę związaną ze sprawdzaniem danych wejściowych - to jest dla >> mnie jasne. Chodzi mi o praktykę w sytuacji gdy użytkownik ma prawo >> wprowadzić albo ujemną liczbę albo dodatnią. Tego nie wiemy. Jaka jest >> praktyka? Czy: >> - sprawdza się występowanie znaku minus i skacze do operacji >> przeznaczonych dla liczb ujemnych/ dodatnich > > Tak chyba będzie lepiej. W czasie wczytywania liczb należy jednak > przy okazji zadbać, by nie wykroczyły z określonego przedziału (tzn. > aby nie można było wpisać więcej niż 127 czy mniej niż -128 dla bajtu). No tu Kolega przegiął. Albo zakładamy, że dane mogą mieć znak i piszemy program tak, żeby przetwarzał poprawnie lizby ze znakiem, albo zakładamy, że liczby są nieujemne i piszemy program dla nieujemnych. Sprawdzanie i rozgałęzianie to pomysł na poziomie programisty - przedszkolaka. Odnoszę wrażenie, że Autor wątku nie wyczuwa, że operacje dla liczb ze znakiem działają tak samo dobrze dla liczb dodatnich i ujemnych. Rónica pomiędzy operacjami "ze znakiem" i "bez znaku" polega na interpretacji takich wartości, które mają najbardziej znaczący bit równy 1 (odpowiednio jako ujemnych i bardzo dużych dodatnich).
Re: Operacje ze znakiem i bez znaku
Author: Bogdan (bogdro)
Date: Sat, 18 Nov 2006 12:13
Date: Sat, 18 Nov 2006 12:13
47 lines
3727 bytes
3727 bytes
Bernard napisał(a): > Bogdan (bogdro) wrote: >> Johnny napisał(a): >>> Rozumiem ideę związaną ze sprawdzaniem danych wejściowych - to jest dla >>> mnie jasne. Chodzi mi o praktykę w sytuacji gdy użytkownik ma prawo >>> wprowadzić albo ujemną liczbę albo dodatnią. Tego nie wiemy. Jaka jest >>> praktyka? Czy: >>> - sprawdza się występowanie znaku minus i skacze do operacji >>> przeznaczonych dla liczb ujemnych/ dodatnich >> >> Tak chyba będzie lepiej. W czasie wczytywania liczb należy jednak >> przy okazji zadbać, by nie wykroczyły z określonego przedziału (tzn. >> aby nie można było wpisać więcej niż 127 czy mniej niż -128 dla bajtu). > > No tu Kolega przegiął. Albo zakładamy, że dane mogą mieć znak i piszemy > program tak, żeby przetwarzał poprawnie lizby ze znakiem, albo > zakładamy, że liczby są nieujemne i piszemy program dla nieujemnych. > Sprawdzanie i rozgałęzianie to pomysł na poziomie programisty - > przedszkolaka. Być może. Kto powiedział, że ja jestem profesjonalistą? :) Ja proponowałem, żeby program poprawnie działał na liczbach ujemnych (pierwsza moja odpowiedź), potem dodałem sprawdzanie zakresu w czasie wpisywania. Być może cytowaną wyżej wypowiedź napisałem zbyt pochopnie, bo właśnie zauważyłem problemik: jak wiecznie złośliwy użytkownik wpisze najpierw 130, a potem -20, to klops. Ogólnie więc zalecam używanie operacji znakowanych i sprawdzanie liczb w czasie wpisywania. > Odnoszę wrażenie, że Autor wątku nie wyczuwa, że operacje dla liczb ze > znakiem działają tak samo dobrze dla liczb dodatnich i ujemnych. Rónica > pomiędzy operacjami "ze znakiem" i "bez znaku" polega na interpretacji > takich wartości, które mają najbardziej znaczący bit równy 1 > (odpowiednio jako ujemnych i bardzo dużych dodatnich). Tak. Rzecz w tym, aby prawidłowo zinterpretować wynik jako ujemny lub dodatni, a do tego potrzebna jest wiedza o typie wpisywanych danych. Jak użytkownik chce obliczyć -1*1, to wolałby zobaczyć -1 niż 255. Należy więc z góry przyjąć, co chcemy zrobić. Wyjścia są 2: - liczby bez znaku, sprawdzanie zakresu 0-FF i flagi CF po działaniach - liczby ze znakiem, sprawdzanie zakresu 80h-7Fh i flagi OF -- Pozdrawiam, Bogdan (Linux i FreeDOS) Kurs assemblera x86 (DOS i Linuks): http://rudy.mif.pg.gda.pl/~bogdro Grupy dyskusyjne o asm: pl.comp.lang.asm alt.pl.asm alt.pl.asm.win32 Rozmawiaj bezpiecznie: www.JabberPL.org Surfuj anonimowo: tor.eff.org
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads