Forum: Compiler & IDEs 64Bit Zahl unter AVR-Studio


von R.Quentin (Gast)


Lesenswert?

Hallo,
ich arbeite unter AVR-Studio in C und programmiere einen Mega8. (Alles 
Neuste Versionen)

Mein Problem, ich brauche gerade eine 64Bit Variable, aber weder die 
deklaration mit "long long" noch "uint64_t" bzw. "int64_t" bringt die 
gewünschten Ergebnisse. Hier mal ein Beispiel Code:
1
#include <avr/io.h>
2
#include <stdint.h>
3
4
int main (void){
5
  int64_t einfach=0xaaaaaaaaa;
6
return 0;
7
}
Die Fehlerausgabe ist immer gleich:
../main.c:15: warning: integer constant is too large for 'long' type

Ich meine klar ist die Variable zu lang für ein "long" (32Bit), daher ja
auch die deklaration als 64Bit Variable (double)<-geht im übrigen auch 
nicht.

Jemand eine Idee?

Gruß
Ralf

von Oliver (Gast)


Lesenswert?

1
Compiling C: main.c
2
avr-gcc -c -mmcu=atmega8 -I. -gdwarf-2 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=./main.lst  -std=gnu99 -Wundef -MMD -MP -MF .dep/main.o.d main.c -o main.o 
3
main.c: In function 'main':
4
main.c:5: warning: unused variable 'einfach'
5
6
Linking: main.elf

Bei mir gehts.

Oliver

von Stefan K. (_sk_)


Lesenswert?

Welche Compiler-Version benutzt Du?
Welche Aufrufoptionen? (-s  ?)


Gerade an den unterstützten uintxx_t ist in der letzten Version viel 
geändert worden.

Viele Grüße, Stefan

von Falk B. (falk)


Lesenswert?

@  R.Quentin (Gast)

>deklaration mit "long long" noch "uint64_t" bzw. "int64_t" bringt die
>gewünschten Ergebnisse. Hier mal ein Beispiel Code:

Versuchs mal so.
1
#include <avr/io.h>
2
#include <stdint.h>
3
4
int main (void){
5
  int64_t einfach=0xaaaaaaaaaLL;
6
return 0;
7
}

Die Endung LL machts.

MfG
Falk

von R.Quentin (Gast)


Lesenswert?

Jupp, danke Falk, das war´s.

Bei der Überprüfung von Bits, sprich "rein"Shiften und "verunden" mit 1 
hatte ich schonmal das gleiche Problem, allerdings mit 32 Bit Zahlen. 
(if(einfach & 1L<<j){...

Jetzt mußte es dann halt an der Stelle auch if(einfach & 1LL<<j){... 
heißen.

Ist aber auch wirklich ne komische Notation mit der nachgestellten 
Typdefinition.

Naja, hauptsache es geht, vielen dank nochmal.

Gruß
Ralf

P.S.:
@Steffan: "Welche Compiler-Version benutzt Du?"
"(Alles Neuste Versionen)"
(Sprich, am 12.12. hab ich die Anfrage gestellt, am 12.12. habe ich mir 
sämtliche Software neu runtergeladen, installiert, probiert und dann 
erst meine Frage gestellt, alles Neuste Versionen halt)
"Welche Aufrufoptionen? (-s  ?)"
"ich arbeite unter AVR-Studio..."
Welche automatischen Makefile Apendixe dort aufgerufen werden 
instressiert, falsch, will mich nicht wirklich intressierten.
Ansonsten kommt man nämlich sehr schnell vor lauter Makefile 
Programmierung nicht mehr zur eigendlichen Programmierung.
Danke trotzdem für den Versuch.

von Stefan K. (_sk_)


Lesenswert?

>"(Alles Neuste Versionen)"

oh sorry, das hatte ich überlesen.


Viele Grüße, Stefan

von Falk B. (falk)


Lesenswert?

@ R.Quentin (Gast)

>Jetzt mußte es dann halt an der Stelle auch if(einfach & 1LL<<j){...
>heißen.

>Ist aber auch wirklich ne komische Notation mit der nachgestellten
>Typdefinition.

>Naja, hauptsache es geht, vielen dank nochmal.

Pass aber auf. 32/64 Bit Operatioen sind auf dem AVRGCC bisweilen 
grausam realisiert. Tierisch speicherintensiv und langsam. Siehe

Beitrag "Re: Frage zur C Syntax"

MFG
Falk

von Ole (Gast)


Lesenswert?

Was spricht dagegen, die 64 Bit Zahl als Double zu deklarieren? Das 
funktioniert bei mir prinzipiell auch, allerdings habe ich auch Probleme 
beim reinshiften. Wie lautet die nachgestellte Typdefinition für die 1 
hier?

Gruß Ole

von Falk B. (falk)


Lesenswert?

@ Ole (Gast)

>Was spricht dagegen, die 64 Bit Zahl als Double zu deklarieren? Das

Beim AVRGCC sind Float und Double nur 32 Bit.

>funktioniert bei mir prinzipiell auch, allerdings habe ich auch Probleme
>beim reinshiften. Wie lautet die nachgestellte Typdefinition für die 1
>hier?

1LL. Das ist dann aber 64 Bit Integer.

MFG
Falk

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.