Signed und Unsigned Integer-Mix Trouble im Array (C++, Teensy)

Gast #5335070
Lesenswert?

Hallo, ich versuche in einem Array auf einzelne Elemente über 
Pseudovariablen zuzugreifen. Das funktioniert bisher nur, wenn die Typen 
exakt gleich definiert sind.

Beispiel:
1
uint16_t memory[10];
2

3
uint16_t &a = memory[0];                // geht
4
 int16_t &b = memory[1];                // geht nicht
5
 int16_t &c = (int16_t) memory[2];      // geht nicht
6
 int16_t &d = (int16_t) &memory[3];     // geht nicht

Variable a liegt an der gleichen Adresse wie memory[0]. Ich kann die 
Variable lesen und schreiben und die Schreibweisen "a" und "memory[0]" 
synonym benutzen.

Leider funktioniert das nicht, wenn ich Variablen von einem anderen Typ 
anlege (int16_t anstatt uint16_t).

Bei Variable b erhalte ich folgende Fehlermeldung:
1
int_uint:4: error: invalid initialization of non-const reference of type 'int16_t& {aka short int&}' from an rvalue of type 'int16_t {aka short int}'

Ich dachte, dass ein cast hier hilft (siehe Variable c), aber leider tut 
es das nicht:
1
int_uint:5: error: invalid initialization of non-const reference of type 'int16_t& {aka short int&}' from an rvalue of type 'int16_t {aka short int}'

Nach etwas Probieren bin ich auf die Deklaration der Variable d 
gekommen, die zwar immer noch eine Fehlermeldung produziert, welche aber 
weniger schlimm klingt.
1
int_uint:6: error: cast from 'uint16_t* {aka short unsigned int*}' to 'int16_t {aka short int}' loses precision [-fpermissive]

Mit "loses precision" kann ich leben, das ist ja sogar gewollt. Aber wie 
sage ich das dem Compiler?

Wie kann ich weiter vorgehen?
Ist es möglich, z.B. ein zweites Array als int16_t zu definieren, das an 
der gleichen Adresse wie "memory[10]" liegt?
Dann könnte ich sagen:
1
int16_t &signedmemory[10] = memory[10];
2
int16_t &b = signedmemory[1];

Leider funktioniert es so natürlich nicht. Habe ich schon probiert. 
Google ist hier ausnahmsweise nicht so hilfreich, da bei der Suche nach 
Signed und Unsigned Variablen immer nur grundlegende Beschreibungen zum 
Unterschied von Signed und Unsigned der C++ Typen gefunden werden.

Außerdem möchte ich gerne noch 32 Bit integer im selben Array ablegen 
können.

Wer weiß Rat?
#5335109
Lesenswert?

Niklas G. schrieb:
> Felix U. schrieb:
>> Wieso sollte das plattformabhängig sein?
> Weil Vorzeichenformate plattform-spezifisch sind. Allgemein ist der
> Zugriff auf Variablen über eine Referenz/Pointer anderen Typs
> plattformabhängig oder gleich ganz fehlerhaft.

Naja, dass er die Zahlen unterschiedlich interpretieren möchte, heißt ja 
schon, dass er vom Zweierkomplement oder irgendeinem anderen Format 
ausgeht. Sonst könnte er ja von vorneherein nur signed-Typen nutzen.
Persönliche Seite #5335112
Lesenswert?

Felix U. schrieb:
> Naja, dass er die Zahlen unterschiedlich interpretieren möchte, heißt ja
> schon, dass er vom Zweierkomplement oder irgendeinem anderen Format
> ausgeht.
Das ist die Frage. Mir ist nicht klar, was er überhaupt will. Einfache 
Signed->Unsigned Konvertierungen gehen auch per static_cast. Vielleicht 
geht es auch um Speicher sparen (union?) oder er braucht sowas wie 
Boost.Any.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren