 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
ciko Član

Pridružen-a: Čet 27 Mar 2008 11:41 Prispevkov: 126 Aktiv.: 0.60 Kraj: Novo mesto
|
Objavljeno: Sre Avg 31, 2011 9:22 am Naslov sporočila: Array in U64 |
|
|
Živjo,
programiram eno aplikacijo z LPC17xx in Keil.
Za shranjevanje določenih podatkov uporabljam polje, ki je definirano kot U64 (typedef unsigned long long U64).
Težavo imam ko želim vpisati v polje vrednost 0x80000000, zapiše pa mi 0xffffffff80000000.
Naredil sem čist preprost primer - izsek iz aplikacije:
Koda: |
//globalna spremenljivka
U64 AreaProfile_Table[80];
//lokalne spremenljivke
U64 i,j, k, mask;
j = 3;
k = 7;
mask = (U64)((1<<(j*8 + k)));
i = AreaProfile_Table[31]; //tukaj je vrednost 0
i = mask | i; //i = 0x80000000
AreaProfile_Table[31] = i; ?!? v AreaProfile_Table se zapiše 0xffffffff80000000
|
Morda ideja, zakaj se noče vpisati pravilna vrednost oz kako to doseči?
V kolikor ne bo šlo drugače bom pač moral razdeliti Array na dva dela.
Lp,
Peter |
|
Nazaj na vrh |
|
 |
MitjaN Član

Pridružen-a: Sre 17 Avg 2011 15:40 Prispevkov: 91 Aktiv.: 0.54 Kraj: Ljubljana
|
Objavljeno: Čet Sep 01, 2011 4:39 am Naslov sporočila: |
|
|
Živijo,
jaz vidim dve možni razlagi obe pa predpostavljata napako prevajalnika:
1. konstanta "1" je privzeto tipa int (signed int če smo natančni) in glede na kodo, je tega tipa tudi, ko jo prekamkneš v desno. Nato pa jo zapišeš v U64. in pri pretvorbi tipa lahko pomotoma pride do razširitve predznaka. To lahko preveriš s tem, da pogledaš kaj se zapiše v spremenljivko "mask". Morebiti bi pomagalo če bi konstanto "1" zapisal kot U64 preden jo premakneš v desno (z "((U64)1) ali pa z "1LL").
2. Prevajalnik ima težave z operacijami nad "unsigned long long" tipi (spremenljivka "mask" ima pravilno vrednost, rezultat "|" operacije pa vrne napačen rezultat)
Po mojih izkušnjah ima kaj nekaj prevajalnikov (določene verzije TI-jevih prevajalnikov za 430 in C2000 serijo in nekateri prevajalniki ki temeljijo na gcc-ju) težave z "long long" tipi, tako da se ti splača tudi prebrati kakšen ReleaseNote, oziroma Compiler Errata seznam.
Mitja |
|
Nazaj na vrh |
|
 |
ciko Član

Pridružen-a: Čet 27 Mar 2008 11:41 Prispevkov: 126 Aktiv.: 0.60 Kraj: Novo mesto
|
Objavljeno: Čet Sep 01, 2011 9:25 am Naslov sporočila: |
|
|
MitjaN je napisal/a: |
Živijo,
jaz vidim dve možni razlagi obe pa predpostavljata napako prevajalnika:
1. konstanta "1" je privzeto tipa int (signed int če smo natančni) in glede na kodo, je tega tipa tudi, ko jo prekamkneš v desno. Nato pa jo zapišeš v U64. in pri pretvorbi tipa lahko pomotoma pride do razširitve predznaka. To lahko preveriš s tem, da pogledaš kaj se zapiše v spremenljivko "mask". Morebiti bi pomagalo če bi konstanto "1" zapisal kot U64 preden jo premakneš v desno (z "((U64)1) ali pa z "1LL").
2. Prevajalnik ima težave z operacijami nad "unsigned long long" tipi (spremenljivka "mask" ima pravilno vrednost, rezultat "|" operacije pa vrne napačen rezultat)
Po mojih izkušnjah ima kaj nekaj prevajalnikov (določene verzije TI-jevih prevajalnikov za 430 in C2000 serijo in nekateri prevajalniki ki temeljijo na gcc-ju) težave z "long long" tipi, tako da se ti splača tudi prebrati kakšen ReleaseNote, oziroma Compiler Errata seznam.
Mitja |
Težava je, ko vrednost i, ki je sicer 0x80000000 zapišem v polje. Šiftanje deluje normalno. Namesto vrednosti 0x80000000, ki jo ima i, se zapiše v polje 0xffffffff80000000. Pri tem se spremenljivka tipa U64 zapiše v polje, ki je definirano kot U64.
No sedaj sem naredil dva polja z U32.
Peter |
|
Nazaj na vrh |
|
 |
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 486 dni
Powered by phpBB © 2001, 2005 phpBB Group
|