64bit Variable in 8x 8bit array schreiben

Gast #6043177
Lesenswert?

Hallo,

irgendwie stehe ich auf dem Schlauch...
Ich habe eine 64bit große Variable .
Die möchte ich nun in ein 8 byte großes Array schreiben.
Wie mache ich das am Besten?

Beispiel:

var_64_bit = irgendein riesengroßer wert;
array[0] = 1. 8 bits der variable also Bit0 bis Bit7 von "var_64_bit"
array[1] = 2. 8 bits der variable
array[2] = 3. 8 bits der variable
array[3] = 4. 8 bits der variable
array[4] = 5. 8 bits der variable
array[5] = 6. 8 bits der variable
array[6] = 7. 8 bits der variable
array[7] = 8. 8 bits der variable

Danke für die Hilfe.

Stefan
Gast #6043193
Lesenswert?

Damit man genau solchen Krampf nicht mit shifts machen muss,
gibt es Unions. Falls auf einer der Zielarchitekturen die
Endianess nicht passt, muss man halt mal kurz umschalten.
Ernsthafte Compiler haben da Pragmas dafuer.
Moderator #6043282
Lesenswert?

Thomas W. schrieb:
> *(uint64_t*)&array[0] = var_64_bit;

Das verstößt gegen die "strict aliasing rule", die da lautet:

1
An object shall have its stored value accessed only by an lvalue
2
expression that has one of the following types:
3

4
- a type compatible with the effective type of the object,
5

6
- a qualified version of a type compatible with the effective type of the
7
  object,
8

9
- a type that is the signed or unsigned type corresponding to the
10
  effective type of the object,
11

12
- a type that is the signed or unsigned type corresponding to a qualified
13
  version of the effective type of the object,
14

15
- an aggregate or union type that includes one of the aforementioned
16
  types among its members (including, recursively, a member of a
17
  subaggregate or contained union), or
18

19
- a character type.

(Quelle: ISO/IEC 9899:2017 Programming Languages — C, N2176)
#6043436
Lesenswert?

pumuggl schrieb:
> Damit man genau solchen Krampf nicht mit shifts machen muss,
> gibt es Unions.

Nein. Sie wurden zwar so oft dafür missbraucht, dass das in C irgendwann 
mal auch erlaubt wurde, aber gedacht waren sie dafür nicht.

> Falls auf einer der Zielarchitekturen die Endianess nicht passt, muss man
> halt mal kurz umschalten.
> Ernsthafte Compiler haben da Pragmas dafuer.

Ernsthafte Programmierer nutzen keine proprietären 
Compiler-Erweiterungen für etwas, das auch portabel geht.
Gast #6043494
Lesenswert?

Yalu X. schrieb:

> Das verstößt gegen die "strict aliasing rule", die da lautet:
[...]

Und wieder mal die Bibel zitiert...

Es gibt auch Andersgläubige, für die die C-Bibel soviel wert ist wie ein 
trockener Furz im Seewind.

Davon mal abgesehen: der TO hat sich weder auf eine Sprache festgelegt 
noch hat er spezifiziert, dass er die Einzelbytes in dem Array in einer 
bestimmten Reihenfolge haben möchte.

Damit ist sowieso alles offen und jede, wirklich jede Lösung richtig, 
sofern sie nur die 64Bit irgendwie in 8Bytes zerlegt...

C ist dafür sowieso vollkommen ungeeignet, weil in dieser Dreckssprache 
Bytes überhaupt nicht existieren, jedenfalls nicht in der Form, wie sie 
heutzutage jeder geistig Normale versteht, nämlich als Ansammlung von 
8Bits...
Gast #6043508
Lesenswert?

c-hater schrieb:

> Es gibt auch Andersgläubige, für die die C-Bibel soviel wert ist wie ein
> trockener Furz im Seewind.

Die programmieren dann kein C und wundern sich, wenn ihr kaputter Code 
auf einmal zerbricht.

> C ist dafür sowieso vollkommen ungeeignet, weil in dieser Dreckssprache
> Bytes überhaupt nicht existieren, jedenfalls nicht in der Form, wie sie
> heutzutage jeder geistig Normale versteht, nämlich als Ansammlung von
> 8Bits...

Was genau glaubst Du eigentlich, wofür "uint8_t" steht? Seit ZWEI 
JAHRZEHNTEN?
#6043559
Lesenswert?

c-hater schrieb:
> Nop schrieb:
>
>> Was genau glaubst Du eigentlich, wofür "uint8_t" steht? Seit ZWEI
>> JAHRZEHNTEN?
>
> Und wo genau kam uint8_t im OT vor? Der Mann will Bytes. Und in
> praktisch jeder Sprache außer C/C++ kann er Bytes bekommen...

Jetzt machst Du Dich lächerlich. Manchmal kann man zwar noch schmunzeln 
wenn Du wieder mal so nen wortgewaltigen Ausbruch wie oben hast, aber 
das jetzt war irgendwie völliger Käse.
Gast #6043607
Lesenswert?

Heiko L. schrieb:

> Für eine Zahl <256.

Mit 8 bit, was man als Byte bezeichnet. Auf Systemen, wo ein Byte nicht 
8 Bit hätte, gäbe es diesen Datentyp deswegen nicht. Der Rest des 
Artikels dreht sich lediglich darum, daß die Aliasing-Regeln für uint8_t 
nicht wie für char gelten, was aber auch nicht notwendig ist.
#6043618
Lesenswert?

c-hater schrieb:
> Es gibt auch Andersgläubige, für die die C-Bibel soviel wert ist wie ein
> trockener Furz im Seewind.

Ein internationaler ISO-Standard ist keine Bibel, und programmieren hat 
nicht viel mit glauben zu tun, sondern damit, eine Spezifikation zu 
verstehen und korrekt anzuwenden. Wer sich dazu entschließt, was anderes 
zu "glauben" als das, was in der Spezifikation steht, wird natürlich 
auch nichts auf die Reihe bekommen.
#6043621
Lesenswert?

Nop schrieb:
> Heiko L. schrieb:
>
>> Für eine Zahl <256.
>
> Mit 8 bit, was man als Byte bezeichnet. Auf Systemen, wo ein Byte nicht
> 8 Bit hätte, gäbe es diesen Datentyp deswegen nicht. Der Rest des
> Artikels dreht sich lediglich darum, daß die Aliasing-Regeln für uint8_t
> nicht wie für char gelten, was aber auch nicht notwendig ist.

Wenn man nicht uint8_t* nimmt, um einfach im Speicher rumzulesen schon. 
:)
#6043636
Lesenswert?

Rolf M. schrieb:
> c-hater schrieb:
>> Es gibt auch Andersgläubige, für die die C-Bibel soviel wert ist wie ein
>> trockener Furz im Seewind.
>
> Ein internationaler ISO-Standard ist keine Bibel, und programmieren hat
> nicht viel mit glauben zu tun, sondern damit, eine Spezifikation zu
> verstehen und korrekt anzuwenden.

Je nachdem, ob das Komittee dann noch ein paar Definitionen nachreicht, 
oder entschließt, eine Definitionslücke für Optimierungen zu 
verwenden...
Gast #6043640
Lesenswert?

Heiko L. schrieb:

> Wenn man nicht uint8_t* nimmt, um einfach im Speicher rumzulesen schon.
> :)

Das sollte man nicht tun. Wäre ja auch nicht sinnvoll, wenn uint8_t 
alles aliasen würde, weil das dann numerische Berechnungen verlangsamen 
könnte.

Für sowas nimmt man char* und stellt im Sinne der Portabilität erstmal 
sicher, daß das überhaupt 8 bit sind. Byteweises Lesen ergibt 
schließlich nur Sinn auf Architekturen, wo es überhaupt Bytes gibt (was 
allerdings heute der Normalfall ist). Aber C kann man eben auch auf CPUs 
loslassen, die anders aufgebaut sind.
Gast #6048336
Lesenswert?

Hallo...
Erstmal vielen Dank dafür...

Ich habe es jetzt so gemacht:
1
uint8_t array[8];
2
 uint64_t var_64_bit = 0xFFEEDDCCBBAA2211;
3
    
4
    for (char i = 0; i < 8; i++) {
5
      array[i] =  (uint8_t)(var_64_bit >> (i * 8));
6
    }
Das läuft prima...
Vielen Dank dafür.

Wollte jetzt hier keine Grundsatzdiskussion vom Zaun brechen.

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