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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.