🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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
#836
Author: Johnny
Date: Fri, 17 Nov 2006 08:21
18 lines
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
#837
Author: Bogdan (bogdro)
Date: Fri, 17 Nov 2006 08:46
26 lines
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
#838
Author: Johnny
Date: Fri, 17 Nov 2006 10:38
20 lines
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
#839
Author: Matuzalem
Date: Fri, 17 Nov 2006 13:14
26 lines
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
#840
Author: Johnny
Date: Fri, 17 Nov 2006 14:23
15 lines
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
#841
Author: Bogdan (bogdro)
Date: Fri, 17 Nov 2006 14:40
24 lines
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
#842
Author: Johnny
Date: Fri, 17 Nov 2006 15:01
9 lines
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
#843
Author: Bernard
Date: Sat, 18 Nov 2006 09:50
24 lines
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
#844
Author: Bogdan (bogdro)
Date: Sat, 18 Nov 2006 12:13
47 lines
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