/ Forside / Karriere / Uddannelse / Højere uddannelser / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Højere uddannelser
#NavnPoint
Nordsted1 1588
erling_l 1224
ans 1150
dova 895
gert_h 800
molokyle 661
berpox 610
creamygirl 610
3773 570
10  jomfruane 570
1 < -2?
Fra : Paminu


Dato : 02-08-05 23:54

Jeg forsøger at vise at 1 < -2 er falsk, med 2-bit i 2-komplements notation.

1 < -2 er falsk hvis:

(1 - (-2)) > 0

idet 1 - (-2) = 1+2 = 3 som er større end 0 så er det vist.

Men problemet opstår når man forsøger at bruge 2-bit i 2-komplements
notation.

Man tager differensen imellem 2 tal ved at lave en addition i stedet hvor 2.
addend negeres og der ligges 1 til:

-2 = 10 (2-komplement)

Først negeres 10:

01

og der ligges 1 til:

10

men dette svarer jo stadig til -2 så jeg går udfra at det ikke er muligt at
undersøge gyldigheden af "1 < -2" med 2-bit i 2-komplements notation?

 
 
Jens Axel Søgaard (02-08-2005)
Kommentar
Fra : Jens Axel Søgaard


Dato : 02-08-05 22:20

Paminu wrote:
> Jeg forsøger at vise at 1 < -2 er falsk, med 2-bit i 2-komplements notation.
>
> 1 < -2 er falsk hvis:
>
> (1 - (-2)) > 0
>
> idet 1 - (-2) = 1+2 = 3 som er større end 0 så er det vist.
>
> Men problemet opstår når man forsøger at bruge 2-bit i 2-komplements
> notation.
>
> Man tager differensen imellem 2 tal ved at lave en addition i stedet hvor 2.
> addend negeres og der ligges 1 til:
>
> -2 = 10 (2-komplement)
>
> Først negeres 10:
>
> 01
>
> og der ligges 1 til:
>
> 10
>
> men dette svarer jo stadig til -2 så jeg går udfra at det ikke er muligt at
> undersøge gyldigheden af "1 < -2" med 2-bit i 2-komplements notation?

Hvis du skal undersøge om x>y så er en strategi at dele op i tilfælde:

Hvis x<0 og y>0 så fås falsk
Hvis x>0 og y<0 så sås sand
Ellers brug din metode

--
Jens Axel Søgaard



Paminu (02-08-2005)
Kommentar
Fra : Paminu


Dato : 02-08-05 22:47


"Jens Axel Søgaard" <usenet@soegaard.net> skrev i en meddelelse
news:42efe38a$0$37095$edfadb0f@dread12.news.tele.dk...
> Paminu wrote:
>> Jeg forsøger at vise at 1 < -2 er falsk, med 2-bit i 2-komplements
>> notation.
>>
>> 1 < -2 er falsk hvis:
>>
>> (1 - (-2)) > 0
>>
>> idet 1 - (-2) = 1+2 = 3 som er større end 0 så er det vist.
>>
>> Men problemet opstår når man forsøger at bruge 2-bit i 2-komplements
>> notation.
>>
>> Man tager differensen imellem 2 tal ved at lave en addition i stedet hvor
>> 2.
>> addend negeres og der ligges 1 til:
>>
>> -2 = 10 (2-komplement)
>>
>> Først negeres 10:
>>
>> 01
>>
>> og der ligges 1 til:
>>
>> 10
>>
>> men dette svarer jo stadig til -2 så jeg går udfra at det ikke er muligt
>> at
>> undersøge gyldigheden af "1 < -2" med 2-bit i 2-komplements notation?
>
> Hvis du skal undersøge om x>y så er en strategi at dele op i tilfælde:
>
> Hvis x<0 og y>0 så fås falsk
> Hvis x>0 og y<0 så sås sand
> Ellers brug din metode


Den mulighed forligger ikke. Den eneste måde jeg kan undersøge om noget er
større end eller mindre end er ved at undersøge om differensen er positiv
eller negativ.

Hvad jeg ikke forstår er at det beskrevet eksempel ikke går under
definitionen for "overflow" der siger at dette netop opstår hvis man ligger
2 positive tal samme og resultatet er negativt. Eller hvis man ligger 2
negative tal sammen og resultatet bliver positivt.

Når man ligger 1 til "2" (01 + 10) så svarer det jo i 2-komplement til et
postitivt og et negativt tal.



Bertel Lund Hansen (02-08-2005)
Kommentar
Fra : Bertel Lund Hansen


Dato : 02-08-05 23:30

Paminu skrev:

>>> Først negeres 10:

>>> og der ligges 1 til:

>>> 10

>>> men dette svarer jo stadig til -2

I et C-program med 32-bit tal får jeg ikke overflowfejl hvis jeg
negerer det maksimale negative tal. Jeg får blot tallet selv.

>> Hvis du skal undersøge om x>y så er en strategi at dele op i tilfælde:

>Den mulighed forligger ikke.

Så kan problemet ikke løses.

Må du teste for om -tal == tal?

--
Bertel
http://bertel.lundhansen.dk/   FIDUSO: http://fiduso.dk/

Martin Larsen (02-08-2005)
Kommentar
Fra : Martin Larsen


Dato : 02-08-05 23:56

"Bertel Lund Hansen" <nospamfilius@lundhansen.dk> skrev i en meddelelse news:2qsve1hjgov1art649l3nm755u5c1ma5gj@news.stofanet.dk...
>
> I et C-program med 32-bit tal får jeg ikke overflowfejl hvis jeg
> negerer det maksimale negative tal. Jeg får blot tallet selv.
>
Hardwaren (PC) vil sætte overflow. Mon det er en speciel C-regel?

Mvh
Martin



Jens Axel Søgaard (03-08-2005)
Kommentar
Fra : Jens Axel Søgaard


Dato : 03-08-05 10:22

Paminu wrote:

> Den mulighed forligger ikke. Den eneste måde jeg kan undersøge om noget er
> større end eller mindre end er ved at undersøge om differensen er positiv
> eller negativ.

Hvor kommer restriktionen fra? (Og hvorfor er den interessant?)

--
Jens Axel Søgaard

Paminu (03-08-2005)
Kommentar
Fra : Paminu


Dato : 03-08-05 14:00

Jens Axel Søgaard wrote:

> Paminu wrote:
>
>> Den mulighed forligger ikke. Den eneste måde jeg kan undersøge om noget
>> er større end eller mindre end er ved at undersøge om differensen er
>> positiv eller negativ.
>
> Hvor kommer restriktionen fra? (Og hvorfor er den interessant?)
>


Det er i forbindelse med konstruktionen af en 2-bits ALU. Kunne selvfølgelig
lave en 3-bit i stedet men så flytter nissen vel bare med.

Når man ønsker at undersøge om a er mindre en b så gøres det ved at tage
undersøge om differensen er negativ eller positiv. I en ALU bestemmer man
differensen ved at lave en addition med anden addends 2-komplement.

Bertel Lund Hansen (03-08-2005)
Kommentar
Fra : Bertel Lund Hansen


Dato : 03-08-05 12:56

Paminu skrev:

>> Hvor kommer restriktionen fra? (Og hvorfor er den interessant?)

>Det er i forbindelse med konstruktionen af en 2-bits ALU. Kunne selvfølgelig
>lave en 3-bit i stedet men så flytter nissen vel bare med.

Ja, men du har ikke forklaret hvorfor du ikke kan lave nogle
undersøgelser i din 2-bit ALU og ikke nødvendigvis beregne
differensen.

Hvis du f.eks. tjekker den første bit og finder at den er 0 ved
01 og 1 ved 10, så følger det deraf at 1 er større end -2.
Hvorfor er det forbudt?

>Når man ønsker at undersøge om a er mindre en b så gøres det ved at tage
>undersøge om differensen er negativ eller positiv.

Hvorfor *skal* man beregne differensen hver gang?

--
Bertel
http://bertel.lundhansen.dk/   FIDUSO: http://fiduso.dk/

Lasse Reichstein Nie~ (03-08-2005)
Kommentar
Fra : Lasse Reichstein Nie~


Dato : 03-08-05 01:12

"Paminu" <asdad@asd.com> writes:

> Hvad jeg ikke forstår er at det beskrevet eksempel ikke går under
> definitionen for "overflow" der siger at dette netop opstår hvis man ligger
> 2 positive tal samme og resultatet er negativt. Eller hvis man ligger 2
> negative tal sammen og resultatet bliver positivt.

.... eller 0. Ellers korrekt.

> Når man ligger 1 til "2" (01 + 10) så svarer det jo i 2-komplement til et
> postitivt og et negativt tal.

Ja, og det giver -1. Ikke noget overflow der.

Din fejl er at antage at du kan negere -2.

Eller også er det at du siger at 2 == -2 i 2-bit 2-komlement, men
samtidig tale om positive og negative tal som om det er forskellige
ting.

/L
--
Lasse Reichstein Nielsen - lrn@hotpop.com
DHTML Death Colors: <URL:http://www.infimum.dk/HTML/rasterTriangleDOM.html>
'Faith without judgement merely degrades the spirit divine.'

Paminu (03-08-2005)
Kommentar
Fra : Paminu


Dato : 03-08-05 12:06

Lasse Reichstein Nielsen wrote:

> "Paminu" <asdad@asd.com> writes:
>
>> Hvad jeg ikke forstår er at det beskrevet eksempel ikke går under
>> definitionen for "overflow" der siger at dette netop opstår hvis man
>> ligger 2 positive tal samme og resultatet er negativt. Eller hvis man
>> ligger 2 negative tal sammen og resultatet bliver positivt.
>
> ... eller 0. Ellers korrekt.
>
>> Når man ligger 1 til "2" (01 + 10) så svarer det jo i 2-komplement til et
>> postitivt og et negativt tal.
>
> Ja, og det giver -1. Ikke noget overflow der.


Resultatet er som du påpeger "-1" i 2-komplement notation.

a) Men det vil sige at differensen er negativ.

1 < -2 er sand hvis:
(1 - (-2)) < 0

og ifølge a) er det jo netop tilfældet som betyder at 1 er mindre en -2.

Paminu (03-08-2005)
Kommentar
Fra : Paminu


Dato : 03-08-05 13:56

Lasse Reichstein Nielsen wrote:

> "Paminu" <asdad@asd.com> writes:
>
>> Hvad jeg ikke forstår er at det beskrevet eksempel ikke går under
>> definitionen for "overflow" der siger at dette netop opstår hvis man
>> ligger 2 positive tal samme og resultatet er negativt. Eller hvis man
>> ligger 2 negative tal sammen og resultatet bliver positivt.
>
> ... eller 0. Ellers korrekt.


Hvorhenne kan man læse at det også gælder for "0"? Kan ikke finde det i den
bog jeg bruger.

>> Når man ligger 1 til "2" (01 + 10) så svarer det jo i 2-komplement til et
>> postitivt og et negativt tal.
>
> Ja, og det giver -1. Ikke noget overflow der.
>
> Din fejl er at antage at du kan negere -2.
>
> Eller også er det at du siger at 2 == -2 i 2-bit 2-komlement, men
> samtidig tale om positive og negative tal som om det er forskellige
> ting.
>
> /L


Henning Makholm (03-08-2005)
Kommentar
Fra : Henning Makholm


Dato : 03-08-05 01:55

Scripsit "Martin Larsen" <mlarsen@post7.tele.dk>
> "Bertel Lund Hansen" <nospamfilius@lundhansen.dk> skrev

>> I et C-program med 32-bit tal får jeg ikke overflowfejl hvis jeg
>> negerer det maksimale negative tal. Jeg får blot tallet selv.

> Hardwaren (PC) vil sætte overflow. Mon det er en speciel C-regel?

C-reglen er at effekten af overløb for heltalstyper med fortegn er
udefineret. Svaret behøver endda ikke være det samme hver gang.

--
Henning Makholm "What the hedgehog sang is not evidence."

Henning Makholm (03-08-2005)
Kommentar
Fra : Henning Makholm


Dato : 03-08-05 12:40

Scripsit Paminu <jadajada@asd.com>
> Jens Axel Søgaard wrote:
>> Paminu wrote:

>>> Den mulighed forligger ikke. Den eneste måde jeg kan undersøge om noget
>>> er større end eller mindre end er ved at undersøge om differensen er
>>> positiv eller negativ.

>> Hvor kommer restriktionen fra? (Og hvorfor er den interessant?)

> Det er i forbindelse med konstruktionen af en 2-bits ALU.

Hvorfor kan du ikke observere andet end uddata? Hvis du *konstruerer*
en ALU, kan du da lave alle de udtag (overløbsmenten, interne menter,
the works) du vil.

> Når man ønsker at undersøge om a er mindre en b så gøres det ved at tage
> undersøge om differensen er negativ eller positiv.

Hvem siger at du skal bruge netop den metode?

Et alternativ: Flip den øverste bit i begge inddata og sammenlign
tallene som fortegnsløse i stedet for. Den venstreste bit hvor der er
forskel, afgør den indbyrdes orden.

--
Henning Makholm "Vi skal nok ikke begynde at undervise hinanden i
den store regnekunst her, men jeg vil foreslå, at vi fra
Kulturministeriets side sørger for at fremsende tallene og også
give en beskrivelse af, hvordan man læser tallene. Tak for i dag!"

Lasse Reichstein Nie~ (03-08-2005)
Kommentar
Fra : Lasse Reichstein Nie~


Dato : 03-08-05 19:47

Paminu <jadajada@asd.com> writes:

> Lasse Reichstein Nielsen wrote:
>
>> "Paminu" <asdad@asd.com> writes:
[Definition af overflow]
>>> Eller hvis man
>>> ligger 2 negative tal sammen og resultatet bliver positivt.
>>
>> ... eller 0. Ellers korrekt.
>
> Hvorhenne kan man læse at det også gælder for "0"? Kan ikke finde det i den
> bog jeg bruger.

Ikke noget bog, men hvis du bruger 2-komplement-tal, så vil det mest
negative tal lagt sammen med sig selv give 0, og det er helt jo helt
klart overflow.

/L
--
Lasse Reichstein Nielsen - lrn@hotpop.com
DHTML Death Colors: <URL:http://www.infimum.dk/HTML/rasterTriangleDOM.html>
'Faith without judgement merely degrades the spirit divine.'

Bertel Lund Hansen (02-08-2005)
Kommentar
Fra : Bertel Lund Hansen


Dato : 02-08-05 22:47

Paminu skrev:

>Man tager differensen imellem 2 tal ved at lave en addition i stedet hvor 2.
>addend negeres og der ligges 1 til:

Ja, men

>-2 = 10 (2-komplement)

>Først negeres 10:

Det kan man ikke med kun 2 bit. Man kan vise -2 men højst +1.
Derfor kan man ikke negere -2 inden for de to bit, og derfor går
din beregning galt.

--
Bertel
http://bertel.lundhansen.dk/   FIDUSO: http://fiduso.dk/

Thorbjoern Ravn Ande~ (02-08-2005)
Kommentar
Fra : Thorbjoern Ravn Ande~


Dato : 02-08-05 23:19

Paminu <jadajada@asd.com> writes:

> Først negeres 10:
>
> 01
>
> og der ligges 1 til:
>
> 10

Du har overløb. Brug 3 bits i stedet (og husk at 1=minus i fortegnsbitten).

--
Thorbjørn Ravn Andersen
http://unixsnedkeren.dk/ravn/

Paminu (02-08-2005)
Kommentar
Fra : Paminu


Dato : 02-08-05 23:33


"Thorbjoern Ravn Andersen" <nospam0000@c.dk> skrev i en meddelelse
news:yu2hde89e3n.fsf@luhmann.netc.dk...
> Paminu <jadajada@asd.com> writes:
>
>> Først negeres 10:
>>
>> 01
>>
>> og der ligges 1 til:
>>
>> 10
>
> Du har overløb. Brug 3 bits i stedet (og husk at 1=minus i
> fortegnsbitten).


Hvis man kun vil bruge 2 bit er der så en måde at komme denne type overløb i
forkøbet på? Så vidt jeg har forstået er det kun hvis man addere 2 positive
tal og resultatet bliver negativt eller hvis man addere 2 negative tal og
resultatet bliver positivt, at der opstår overløb.

Men jeg kan ikke lige se at mit eksempel opfylder denne definition.



Thorbjoern Ravn Ande~ (03-08-2005)
Kommentar
Fra : Thorbjoern Ravn Ande~


Dato : 03-08-05 00:18

"Paminu" <asdad@asd.com> writes:

>
> Hvis man kun vil bruge 2 bit er der så en måde at komme denne type overløb i
> forkøbet på? Så vidt jeg har forstået er det kun hvis man addere 2 positive
> tal og resultatet bliver negativt eller hvis man addere 2 negative tal og
> resultatet bliver positivt, at der opstår overløb.
>
> Men jeg kan ikke lige se at mit eksempel opfylder denne definition.

Som udgangspunkt drejer det sig jo om at man lægger tre bit sammen (to
bit plus en mente) fra højre mod venstre og holder styr på menten.

Hvis der er mente på sammenlægningen længst til venstre, er der ikke
noget sted at gøre af den, og den må derfor bortkastes. Flere CPU'er
gemmer en sådan mente i et flag der kan testes på efter
sammenlægningen, men altså væk fra det beregnede resultat.

Ved 2 bit er det mindste heltal der kan repræsenteres 0 (gælder alle),
og det største 2^2-1 (11) altså 3. Ved 8 bit er det største heltal
2^8-1, altså 255.

Ved sammenlægning vil bortkastningen af den sidste mente betyde at 1
og 2^8+1 (257) opfører sig ens for 8-bit tal, og 1 og 2^2+1 (5) opføre
sig ens for 2 bit tal. Der kan lægges vilkårligt mange gange hhv 2^8
og 2^2 til grundtallet og det vil opføre sig ens da menten som sagt
bortkastes. Faktisk vil de forskellige repræsentationer være
uskelnelige på bitniveau.

Tilsvarende kan man også trække et vilkårligt antal hhv 2^8 og 2^2
fra, og få identisk opførsel. Man har derfor bemærket at man kan
vælge at opfatte talrækken 0 til 255 (nu bruger jeg 2^8 for resten)
anderledes.

Man gør nemlig det at man siger at man har brug for både negative og
positive tal, og så er det meget praktisk at dele så nul ligger i
midten, fordi så kan man nemlig lægge skillelinien så alle de negative
tal har 1 i bitten til venstre og alle de positive har 0 i bitten til
venstre.

Det betyder så at for 2^8 vil det største positive tal være 0111 1111
eller 127, og det mindste negative være 1000 0000 eller -128 som før
ville have været 128.

Vi kan igen lægge dem sammen.

0111 1111
+ 1000 0000
-----------
1111 1111

hvilket passer for både 127 + (-128) = -1 og 127 + 128 = 255.

Det drejer sig altså om hvordan bitmønstrene fortolkes. For plus og
minus er der ingen forskel.

For at skifte til dit eksempel med 2 bit og 1 og -2, så er

1 = 01
-2 = 10

som du selv bemærker så er -(-2) = 2 som også er 10. Dem kan du så
lægge sammen.

01
10
--
11

og det er 3. Da du kører fra -2..1 er det det samme som -1.

Min oprindelige bemærkning om der var overløb, var derfor lige hurtig
nok. Der beklages.

Er det lidt klarere nu?

--
Thorbjørn Ravn Andersen
http://unixsnedkeren.dk/ravn/

Paminu (03-08-2005)
Kommentar
Fra : Paminu


Dato : 03-08-05 12:00

Thorbjoern Ravn Andersen wrote:

> "Paminu" <asdad@asd.com> writes:
>
>>
>> Hvis man kun vil bruge 2 bit er der så en måde at komme denne type
>> overløb i forkøbet på? Så vidt jeg har forstået er det kun hvis man
>> addere 2 positive tal og resultatet bliver negativt eller hvis man addere
>> 2 negative tal og resultatet bliver positivt, at der opstår overløb.
>>
>> Men jeg kan ikke lige se at mit eksempel opfylder denne definition.
>
> Som udgangspunkt drejer det sig jo om at man lægger tre bit sammen (to
> bit plus en mente) fra højre mod venstre og holder styr på menten.
>
> Hvis der er mente på sammenlægningen længst til venstre, er der ikke
> noget sted at gøre af den, og den må derfor bortkastes. Flere CPU'er
> gemmer en sådan mente i et flag der kan testes på efter
> sammenlægningen, men altså væk fra det beregnede resultat.
>
> Ved 2 bit er det mindste heltal der kan repræsenteres 0 (gælder alle),
> og det største 2^2-1 (11) altså 3. Ved 8 bit er det største heltal
> 2^8-1, altså 255.
>
> Ved sammenlægning vil bortkastningen af den sidste mente betyde at 1
> og 2^8+1 (257) opfører sig ens for 8-bit tal, og 1 og 2^2+1 (5) opføre
> sig ens for 2 bit tal. Der kan lægges vilkårligt mange gange hhv 2^8
> og 2^2 til grundtallet og det vil opføre sig ens da menten som sagt
> bortkastes. Faktisk vil de forskellige repræsentationer være
> uskelnelige på bitniveau.
>
> Tilsvarende kan man også trække et vilkårligt antal hhv 2^8 og 2^2
> fra, og få identisk opførsel. Man har derfor bemærket at man kan
> vælge at opfatte talrækken 0 til 255 (nu bruger jeg 2^8 for resten)
> anderledes.
>
> Man gør nemlig det at man siger at man har brug for både negative og
> positive tal, og så er det meget praktisk at dele så nul ligger i
> midten, fordi så kan man nemlig lægge skillelinien så alle de negative
> tal har 1 i bitten til venstre og alle de positive har 0 i bitten til
> venstre.
>
> Det betyder så at for 2^8 vil det største positive tal være 0111 1111
> eller 127, og det mindste negative være 1000 0000 eller -128 som før
> ville have været 128.
>
> Vi kan igen lægge dem sammen.
>
> 0111 1111
> + 1000 0000
> -----------
> 1111 1111
>
> hvilket passer for både 127 + (-128) = -1 og 127 + 128 = 255.
>
> Det drejer sig altså om hvordan bitmønstrene fortolkes. For plus og
> minus er der ingen forskel.
>
> For at skifte til dit eksempel med 2 bit og 1 og -2, så er
>
> 1 = 01
> -2 = 10
>
> som du selv bemærker så er -(-2) = 2 som også er 10. Dem kan du så
> lægge sammen.
>
> 01
> 10
> --
> 11
>
> og det er 3. Da du kører fra -2..1 er det det samme som -1.


Resultatet er som du påpeger "-1" i 2-komplement notation.

a) Men det vil sige at differensen er negativ.

1 < -2 er sand hvis:
(1 - (-2)) < 0

og ifølge a) er det jo netop tilfældet.

Thorbjoern Ravn Ande~ (03-08-2005)
Kommentar
Fra : Thorbjoern Ravn Ande~


Dato : 03-08-05 11:39

Paminu <jadajada@asd.com> writes:

> Resultatet er som du påpeger "-1" i 2-komplement notation.
>
> a) Men det vil sige at differensen er negativ.
>
> 1 < -2 er sand hvis:
> (1 - (-2)) < 0
>
> og ifølge a) er det jo netop tilfældet.

Resultatet er 3. Med den fortolkning du har af bitmønsteret er det
uskelneligt fra -1.

Hvis du havde kørt med 3 bits istedet for to, havde det været

001 | 1
+ 010 | + 2 // -(-2)
----- ----
011 | 3

hvor minus et er 111.

--
Thorbjørn Ravn Andersen
http://unixsnedkeren.dk/ravn/

Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408847
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste