[C++] Variabele te klein ?

Pagina: 1
Acties:

  • IJnte
  • Registratie: Juni 2003
  • Laatst online: 19-05 12:01
Ik heb volgens mij een heel dom probleem. Ik moet een redelijk grote waarde vermenigvuldigen met een getal. De uitkomst hiervan klopt volgens mij niet echt. Dit is de Code
C++:
1
2
3
4
 long unsigned int Taperemaining;
 Taperemaining = Taperem[0] +  (Taperem[1] << 8) + (Taperem[2] << 16) + (Taperem[3] << 24 );     // Berekening
ShowMessage(Taperemaining);
Taperemaining = (Taperemaining * 4096);

Voordat ik Taperemaining *4096 doe, komt deze waarde eruit: 8645031.
Nadat ik Taperemaining(met daarin de waarde 8645031) vermenigvuldig met 4096 komt er deze waarde uit:
1050308608.
Als ik dit met mijn rekenmachine uitreken moet er 35410046980 uitkomen(ongeveer).

Waarom klopt dit niet? Is mijn variabele te klein hiervoor? Ik vat em niet helemaal meer..

[ Voor 4% gewijzigd door IJnte op 12-12-2004 19:08 ]

Exploring the world by bicycle! cyclingsilk.wordpress.com


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Ja.
Taperemaing kan maximaal 232-1 zijn.
Als je het narekent zie je ook dat de echte uitkomst - 8* 232 het getal oplevert dat jij ziet. Dus wat jij ziet is het result van een mooie overflow.

[ Voor 62% gewijzigd door Voutloos op 12-12-2004 19:13 ]

{signature}


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 21:24

NMe

Quia Ego Sic Dico.

Voutloos schreef op zondag 12 december 2004 @ 19:12:
Ja.
Taperemaing kan maximaal 232-1 zijn.
Dat kun je niet zomaar zeggen (al is het waarschijnlijk wel zo). Het hangt van je systeem en je programmeeromgeving af hoe groot een variabele kan zijn. De typedeclaratie is volgens mij wel fout. Ik dacht tenminste dat het unsigned long int moet zijn, en niet long unsigned int. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • IJnte
  • Registratie: Juni 2003
  • Laatst online: 19-05 12:01
Voutloos schreef op zondag 12 december 2004 @ 19:12:
Ja.
Taperemaing kan maximaal 232-1 zijn.
:r mm niet goed over nagedacht dus. Ik dacht dat ie veel groter kon zijn. Even beredeneren:
In een int kan een waarde van - of + 32768 aan. Unsigned maakt ervan dat ie 65535 kan onthouden.. Long zorgt ervoor dat er 4x zoveel inkan, dus 65536 (28) * 24 :? Volgens mij kom ik dan niet op 32 uit..

Exploring the world by bicycle! cyclingsilk.wordpress.com


  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

IJnte schreef op zondag 12 december 2004 @ 19:18:
[...]

:r mm niet goed over nagedacht dus. Ik dacht dat ie veel groter kon zijn. Even beredeneren:
In een int kan een waarde van - of + 32768 aan. Unsigned maakt ervan dat ie 65535 kan onthouden.. Long zorgt ervoor dat er 4x zoveel inkan, dus 65536 (28) * 24 :? Volgens mij kom ik dan niet op 32 uit..
Een 32 bits getal kan max 4294967296 aan, je moet gewoon overstappen naar een 64 bits getal 18446744073709551616
Daar heb je voorlopig wel genoeg aan ;)

Btw een long is toch normaal altijd 32bits?
Short is 16bits
En long long is 64bits

[ Voor 7% gewijzigd door Wolfboy op 12-12-2004 19:27 ]

Blog [Stackoverflow] [LinkedIn]


  • IJnte
  • Registratie: Juni 2003
  • Laatst online: 19-05 12:01
Wolfboy schreef op zondag 12 december 2004 @ 19:20:
[...]

Een 32 bits getal kan max 4294967296 aan, je moet gewoon overstappen naar een 64 bits getal 18446744073709551616
Daar heb je voorlopig wel genoeg aan ;)
8) Dat moet wel lukken ja! Domme vraag misschien: Zou een float hiervoor gebruikt kunnen worden :?

[ Voor 5% gewijzigd door IJnte op 12-12-2004 19:27 ]

Exploring the world by bicycle! cyclingsilk.wordpress.com


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 21:24

NMe

Quia Ego Sic Dico.

Wolfboy schreef op zondag 12 december 2004 @ 19:20:
Btw een long is toch normaal altijd 32bits?
Short is 16bits
En long long is 64bits
Bij mijn weten hangt dat van je compiler en van je processor af. Op school werken we bijvoorbeeld met een microcontroller, en in die omgeving is een short even groot als een long long. 8)7

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

-NMe- schreef op zondag 12 december 2004 @ 19:29:
[...]

Bij mijn weten hangt dat van je compiler en van je processor af. Op school werken we bijvoorbeeld met een microcontroller, en in die omgeving is een short even groot als een long long. 8)7
Daar heb je gelijk in, maar als er niet over een aparte omgeving gesproken word dan ga ik gewoon uit van een 32bits architectuur ;)

@TS: aangezien het geen float waarde is lijkt het me ook niet handig om een float te gebruiken.
gebruik gewoon long long of _int64 hiervoor.

Blog [Stackoverflow] [LinkedIn]


  • IJnte
  • Registratie: Juni 2003
  • Laatst online: 19-05 12:01
Wolfboy schreef op zondag 12 december 2004 @ 19:32:
[...]
Daar heb je gelijk in, maar als er niet over een aparte omgeving gesproken word dan ga ik gewoon uit van een 32bits architectuur ;)

@TS: aangezien het geen float waarde is lijkt het me ook niet handig om een float te gebruiken.
gebruik gewoon long long of _int64 hiervoor.
Ik ga de Long Long gebruiken.
Overigens ik las in een ander topic het volgende:
Verwijderd schreef op maandag 06 december 2004 @ 20:32:
Ligt dat gewoon niet aan wat de data model is van het platform dat je runt:

Data TypeLP32ILP32ILP64LLP64LP64
char88888
short1616161616
int3232
int1632643232
long3232643264
long long (int64)64
pointer323264
Betekend dit dat een Long Long platform afhankelijk is?

Exploring the world by bicycle! cyclingsilk.wordpress.com


  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Ja, maar dat is niet alleen bij long long zo.
De grootte van de types hangt af van de compiler en van je platform, helaas is er niet echt een standaard hiervoor.

Blog [Stackoverflow] [LinkedIn]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 21:24

NMe

Quia Ego Sic Dico.

Wolfboy schreef op zondag 12 december 2004 @ 19:32:
Daar heb je gelijk in, maar als er niet over een aparte omgeving gesproken word dan ga ik gewoon uit van een 32bits architectuur ;)
Ik heb ook nog met een DOS-compiler gewerkt op een 32-bits systeem waar een integer maar 8 bits had, dus niet alleen de architectuur is van belang. :)
IJnte schreef op zondag 12 december 2004 @ 19:33:
Betekend dit dat een Long Long platform afhankelijk is?
Dat heb ik inderdaad al 2x gezegd in dit topic. Deze post meegeteld zelfs 3x. :P

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Wolfboy schreef op zondag 12 december 2004 @ 19:35:
De grootte van de types hangt af van de compiler en van je platform, helaas is er niet echt een standaard hiervoor.
-NMe- schreef op zondag 12 december 2004 @ 19:37:
Ik heb ook nog met een DOS-compiler gewerkt op een 32-bits systeem waar een integer maar 8 bits had, dus niet alleen de architectuur is van belang. :)
Ben ik van op de hoogte ;)

Blog [Stackoverflow] [LinkedIn]


  • IJnte
  • Registratie: Juni 2003
  • Laatst online: 19-05 12:01
Mmm nou et moet wel lukken zo. Als ik problemen tegenkom dan hobby ik er wel wat mee!
Alvast bedankt!

Exploring the world by bicycle! cyclingsilk.wordpress.com


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
-NMe- schreef op zondag 12 december 2004 @ 19:15:Dat kun je niet zomaar zeggen (al is het waarschijnlijk wel zo). Het hangt van je systeem en je programmeeromgeving af hoe groot een variabele kan zijn
Daar was ik me al gauw van bewust, vandaar dat ik nog een onderbouwend rekensommetje erbij heb geplaatst om aan te tonen dat het getal te groot was. ;)

{signature}

Pagina: 1