Toon posts:

[Java] Krijg ongewenst negatief getal binnen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Bij het uitlezen van de RS232 poort (de waarden worden vanuit een uP verstuurd per byte), krijg ik ongewenst negatieve waarden binnen.

Dit kom waarschijnlijk door de two-complements methode, maar is dat ook te negeren? Dat als ik '11111111' (8x '1') binnenkrijg, dat dit gewoon 255 is, en dus niet een of andere negatieve waarde..

waarschijnlijk is dit heel simpel, maar ik zit er al een hele tijd op te suffen en kom er niet uit..

[ Voor 8% gewijzigd door Verwijderd op 15-06-2005 11:36 ]


Verwijderd

Java gebruikt signed bytes, de eerste bit geeft dus aan of het positief danwel negatief is :)

  • MaxxRide
  • Registratie: April 2000
  • Laatst online: 09-01 10:13

MaxxRide

Surf's up

idd een unsigned byte gebruiken dan komt het goed

If you are not wiping out you are nog pushing enough...


Verwijderd

MaxxRide schreef op woensdag 15 juni 2005 @ 11:46:
idd een unsigned byte gebruiken dan komt het goed
Die heb je niet in java :)

@TS
Maar wat wil je er verder mee? Als je enkel bitwise moet vergelijken is er geen probleem..

Verwijderd

Topicstarter
goed.. ik ben toch iets verder gekomen.. sterker nog: het is gelukt..

Heb nu het volgende gedaan:
Java:
1
2
3
4
byte b = (byte)150;
System.out.println(b);
int a = b & 0xFF;           
System.out.println(a);


En dit lijkt goed te werken..

[ Voor 5% gewijzigd door Verwijderd op 15-06-2005 12:08 ]


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Snap je ook waarom?

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Topicstarter
jep..

hij controleert de byte (b) bit voor bit met 0xFF (=255) en stopt deze resultaten in deze in 'a', waardoor de MSB gewoon als bit wordt opgevat en niet als sign...

weet niet of het goed uitgelegd is, maar zo ongeveer ;)

[ Voor 4% gewijzigd door Verwijderd op 15-06-2005 13:30 ]


Verwijderd

Verwijderd schreef op woensdag 15 juni 2005 @ 13:29:
jep..

hij controleert de byte (b) bit voor bit met 0xFF (=255) en stopt deze resultaten in deze in 'a', waardoor de MSB gewoon als bit wordt opgevat en niet als sign...

weet niet of het goed uitgelegd is, maar zo ongeveer ;)
Mwoah, ongeveer ;)

je kunt niet typecasten want dan wordt de sign bit behouden in de int en dat wil je neit, dus wat je moet doen is bitwise de 'and' operator uitvoeren. Dus je krijgt feitelijk (waarin x een 0 of 1 is)
xxxxxxxx & 00000000000000000000000011111111 wat dus wel je gewenste resultaat levert.

Verwijderd

Topicstarter
ja die bedoelde ik :P

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Ik denk dat dat fout is. Volgens mij krijg je hier sign-extension.
Je byte is sxxxxxxx, en je doet een & met een (32 bits) integer. De byte wordt dan omgezet in
ssssssss ssssssss ssssssss sxxxxxxx, en die integer wordt dan ge-and met 00000000 00000000 00000000 11111111. Het resultaat is dan 00000000 00000000 00000000 sxxxxxxx. Dit is nog steeds een signed grootheid, alleen de sign is hier altijd 0 (nog steeds meest linkse bit)

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Ik denk het niet :)

misschien nog haakjes om int i = ( b & 0xff )

[ Voor 17% gewijzigd door Verwijderd op 15-06-2005 15:51 ]


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
MSalters schreef op woensdag 15 juni 2005 @ 15:36:
Ik denk dat dat fout is. Volgens mij krijg je hier sign-extension.
Je byte is sxxxxxxx, en je doet een & met een (32 bits) integer. De byte wordt dan omgezet in
ssssssss ssssssss ssssssss sxxxxxxx, en die integer wordt dan ge-and met 00000000 00000000 00000000 11111111. Het resultaat is dan 00000000 00000000 00000000 sxxxxxxx. Dit is nog steeds een signed grootheid, alleen de sign is hier altijd 0 (nog steeds meest linkse bit)
Het is idd nog steeds een signed grootheid. Maar zover ik weet zijn alle primitieve types in Java Signed dus als je een unsigned eenheid wilt beschrijven zal je dit altijd in een groter type signed moeten doen.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • MaxxRide
  • Registratie: April 2000
  • Laatst online: 09-01 10:13

MaxxRide

Surf's up

Het is nog steeds signed, alleen je bent je negativiteit in je byte kwijt. Immers je meest linkerbit is je sign bit (en die is nu 0). Deze conversie geeft dus het gewenste resultaat.

In theorie is het dus waar wat je zegt het is nog steeds een signed grootheid alleen de sign uit de byte is niet meer relevant -> het werkt ;)

[ Voor 34% gewijzigd door MaxxRide op 15-06-2005 16:02 ]

If you are not wiping out you are nog pushing enough...


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Verwijderd schreef op woensdag 15 juni 2005 @ 15:49:
[...]

Ik denk het niet :)

misschien nog haakjes om int i = ( b & 0xff )
Waarom? Denk je dat het zonder die haakjes int (i = b) & 0xff zou zijn? Er is maar een manier om het te lezen.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

MSalters schreef op woensdag 15 juni 2005 @ 19:47:
Denk je dat het zonder die haakjes int (i = b) & 0xff zou zijn?
nee :)
ik vind het netjes
Pagina: 1