byteweise manipulation von "größeren" variablen
-
Hi
wie macht man es in C/C++ ich byteweise variablen manipuliere?
hier mal ein beispiel.
#include "stdafx.h" #include <stdio.h> int _tmain(int argc, _TCHAR* argv[]) { unsigned char high=0x12; unsigned char low=0x34; unsigned short int ausgabe=0x0000; // //...Code? // printf("zahl ist %x",ausgabe); getchar(); return 0; }die ausgabe soll dann "zahl ist 1234" sein. ich könnte das auch mit mathematische operationen machen, aber ich sehe es nicht ein die resourcen zu verschwenden wenn ich es auch byteweise machen kann.
-
Ich würde vermutlich mit Bit-Shift's und Kombinationen arbeiten:
ausgabe=high<<8 | low;- damit bist du eigentlich auf der sicheren Seite.(im Notfall hilf vielleicht auch ein reinterpret_cast an der richtigen Stelle, aber das dürfte alles andere als portabel sein)
-
gibt es keine standart-C möglichkeit mit der man direkt auf die bytes zugreifen kann?
was ist wenn ich demnächst 4 byte eines floats einzeln bekomme? zum beispiel in eine unsigned char array? könnte auch noch passieren.
-
Im Standard ist nichtmal festgelegt, in welcher Reihenfolge die Bytes betrachtet werden, aber auf eigene Gefahr:
char*c=reinterpret_cast<char*>(&ausgabe).(aber um damit etwas sinnvolles machen zu können, mußt du dich sehr gut auskennen)
-
müsste klappen, short int sollte überall 16bit sein, ist ja halt so definiert.
geht das reinterpret_cast auch in GCC?
-
xlomx schrieb:
müsste klappen, short int sollte überall 16bit sein, ist ja halt so definiert.
geht das reinterpret_cast auch in GCC?
ja
-
xlomx schrieb:
müsste klappen, short int sollte überall 16bit sein, ist ja halt so definiert.
geht das reinterpret_cast auch in GCC?
ja
/Edit: ach verflucht, jetzt kam die 2 mal, bitte eine löschen
-
xlomx schrieb:
müsste klappen, short int sollte überall 16bit sein, ist ja halt so definiert.
Es ist festgelegt, daß short mindestens 16 Bit hat - nach oben ist die Größe offen.
-
Die Diskussion hatte ich schon öfter und ich dachte das wäre erledigt.
Hatte mich mit mir selbst darauf geeinigt, das gilt:
sizeof(char) <= sizeof(short) <= sizeof(int) ..Also muss short nicht mindestens 16 Bit sein. oder?
-
Außer diesen Größenverhältnissen definiert der Standard auch Mindestwerte für die entsprechenden Wertebereiche - z.B. für short von 32000 (müßte ich nachsehen). Und daraus ergibt sich natürlich auch eine Minimalgröße

-
standard schrieb:
Plain ints have the natural
size suggested by the architecture of the execution environmentund
standard schrieb:
that is, large enough to contain any value in the range of INT_MIN and INT_MAX, as defined in the header <climits>.
Damit ist ja eine gewisse Mindestgroesse vorgegeben.
gruss
v R
-
nagut, dann muss ich es vorher abfragen.
das mit den mindestgrößen nervt. ich brauche genau definierte größen. zumindest 8, 16 und 32 bit.

ich habe das so verstanden das int die gleiche länge hat wie der adressbus und der rest ist definiert, aber man lernt nie aus
-
Du koenntest z. b. boost::uint8_t, boost::uint16_t und boost::uint32_t nutzen.
Dafuer muss du auch nicht gegen eine Boost-Lib linken.gruss
v R
-
gut werde das so machen.
das problem ist eigendlich nur, ich benutze das auch in einem µC und da soll ja alles möglichs efficient sein.
-
xlomx schrieb:
gut werde das so machen.
das problem ist eigendlich nur, ich benutze das auch in einem µC und da soll ja alles möglichs efficient sein.
Wenn du die Boost-Lib benutzt, wird garantiert, dass boost::uintXX_t auch
tatsaechlich XX Bits breit ist.Wenn du nicht die komplexen Boost-Includes nutzen willst, koenntest du dir
zumindest ansehen, wie die das machen und es gerade uebernehmen.gruss
v R