[C#] bitwise operatie werkt niet

Pagina: 1
Acties:
  • 108 views sinds 30-01-2008
  • Reageer

  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 16-09 20:30
Ik heb 4 bytes (b1,b2,b3,b4) hier wil ik een unsigned int 32 van maken:
uint=b1+b2<<8+b3<<16+b4<<24

Maar dit werkt niet. de b3<<24 heeft een fout als de byte 134 is. binair is dit 10000110 en signed zou dit negatief worden. De foutmelding is: Value was either too large or too small for a UInt32.

als ik dit doe:
C#:
1
2
uint i;
i=Convert.ToUInt32(b4<<24);


krijg ik ook die foutmelding. b4 is een byte, aldus MSDN een unsigned char/int. i moet dus 2248146944 worden en een watch geeft aan dat (b4<<24) -2046820352 is. Waarom werkt dit niet?

if broken it is, fix it you should


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 23:31

.oisyn

Moderator Devschuur®

Demotivational Speaker

convert 'm eerst naar uint, doe daarna pas de shift.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • elgringo
  • Registratie: Januari 2001
  • Laatst online: 16-09 20:30
.oisyn schreef op dinsdag 12 juni 2007 @ 13:22:
convert 'm eerst naar uint, doe daarna pas de shift.
byte is een unsigned integer aldus MSDN

moet ie per se een uint32 worden?

EDIT: casten naar uint32 werkt, toch blijft het onlogisch

[ Voor 8% gewijzigd door elgringo op 12-06-2007 13:26 ]

if broken it is, fix it you should


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Je moet eerst zorgen dat je converteert naar het juiste type voordat je ermee gaat shiften; anders zou je je bits er uit shiften ;)
Sowieso is het handig als je altijd eerst zorgt dat alle typen hetzelfde zijn voor je er mee gaat rekenen.

[ Voor 30% gewijzigd door RobIII op 12-06-2007 13:32 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 23:31

.oisyn

Moderator Devschuur®

Demotivational Speaker

elgringo schreef op dinsdag 12 juni 2007 @ 13:25:
[...]

byte is een unsigned integer aldus MSDN
Dat ontken ik ook niet :)
moet ie per se een uint32 worden?
Een int64 of een uint64 is ook goed, maar iig geen int32
EDIT: casten naar uint32 werkt, toch blijft het onlogisch
Niet als je gewoon de documentatie leest:
4.1.5 Integral types
[..]
For the binary << and >> operators, the left operand is converted to type T, where T is the first of int, uint, long, and ulong that can fully represent all possible values of the operand. The operation is then performed using the precision of type T, and the type of the result is T.
alle waarden van een byte passen in een int, dus is er een impliciete conversie naar int. En dat betekent dat hij negatief wordt als de most significant bit van de byte gezet is :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 23:31

.oisyn

Moderator Devschuur®

Demotivational Speaker

RobIII schreef op dinsdag 12 juni 2007 @ 13:27:
Je moet eerst zorgen dat je converteert naar het juiste type voordat je ermee gaat shiften; anders zou je je bits er uit shiften ;)
Helaas, shifts werken niet op bytes en shorts. Je verhaal zou opgaan als je een 32 bits int wilt shiften en een 64 bits resultaat over wilt houden, maar dat is hier het probleem niet (en anders zou het resultaat nog altijd 0 zijn, en niet een een of andere negatieve waarde ;))

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
.oisyn schreef op dinsdag 12 juni 2007 @ 13:31:
[...]

Helaas, shifts werken niet op bytes en shorts. Je verhaal zou opgaan als je een 32 bits int wilt shiften en een 64 bits resultaat over wilt houden, maar dat is hier het probleem niet (en anders zou het resultaat nog altijd 0 zijn, en niet een een of andere negatieve waarde ;))
Huh? Dat zeg ik toch?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 23:31

.oisyn

Moderator Devschuur®

Demotivational Speaker

Nee, je zegt dat je bits eruit shift (waarmee je lijkt te impliceren dat de shift op byteniveau plaatsvindt). Dat is hier helemaal niet het geval :)

[ Voor 32% gewijzigd door .oisyn op 12-06-2007 13:33 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
.oisyn schreef op dinsdag 12 juni 2007 @ 13:32:
Nee, je zegt dat je bits eruit shift (waarmee je lijkt te impliceren dat de shift op byteniveau plaatsvindt). Dat is hier helemaal niet het geval :)
Die "zouden" er uit shiften (en dus zou het resultaat 0 worden).
Volgens mij lullen we langs elkaar :P Ik zeg het alleen wat ongelukkig. Anyway, we bedoelen hetzelfde volgens mij ;)

[ Voor 20% gewijzigd door RobIII op 12-06-2007 13:35 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 23:31

.oisyn

Moderator Devschuur®

Demotivational Speaker

Het kan aan mij liggen, maar je zegt dat als je niet eerst converteert naar het juiste type, dan zullen de bits eruit shiften. De topicstarter converteert niet naar het juiste type, maar toch shiften de bits er niet uit. Interpreteer ik het nou heel raar of hoe zit dat? :)

.edit: ok :P

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1