FF 255 ?
-
#include <windows.h> #include <stdio.h> struct test { unsigned int a:8, b:8, c:8, d:8; }; char out[1023]; int main(int argc, char* argv[]) { memset(&out, 0, sizeof(out)); test* ptest = (struct test*) out; ptest->a = 0xff; ptest->b = 0xff; ptest->c = 0xff; ptest->d = 0xff; for(int i = 0; i < 1024; i++) { if(out[i]) { printf("%d.Stelle: %u\n", i, out[i]); } } }
Wieso kommt da des raus und nicht 255 überall???????
0.Stelle: 4294967295
1.Stelle: 4294967295
2.Stelle: 4294967295
3.Stelle: 4294967295Danke
:p
-
Ich kann nur raten weil ich keine Lust hab das zu kompilieren. Ich denke mal es liegt an dem %u in printf
. Das steht nämlich für ein unsigned int. Mach das ganze mal mit %c oder so.
-
Bevor wir Fehler im Coding suchen, eine einfache Frage was willst du damit erreichen?
-
verstehen wie das funzt wegen eines asm programms
-
warum zum Teufel castest du ein char Array in ein Struct?
-
Sehe ich das falsch oder ist char out, als Global deklariert???
Code-Hacker
-
char ist mit einem Wertebereich von -128 bis 127 definiert. Also sind in out Werte von -1 und nicht 0xff (255). Da bei Funktionen mit variablen Argumenten all diese an eine Mindestbreite "angepasst" werden (in unserem Fall 32 bit), wird das out[i] (8 bit mit Wert -1) der 32 bit Wert -1. Dies gibst du mit %u (unsigned int: 0 bis 4294967295) aus. Da -1 nicht in diesem Wertebereich liegt, wird er entsprechend interpretiert. Und das hat zur Folge, dass -1 zu 4294967295 wird.
Wenn das rauskommen soll, was du willst, dann mach char out zu unsigned char out.
Du vergewaltigst Datentypen und -formate hier ziemlich übel.btw:
Wenn du schon 1024 Schleifendurchläufe hast, solltest du out auch 1024 Elemente spendieren. Sonst gibts Buffer-Overflows. Ich mach das immer so:#define asizeof(a) (sizeof(a) / sizeof(a[0])) // array size of (number of array elements) char out[1024]; ... for (int i = 0; i < asizeof(out); i++) { ... }
-
Keine Kritik (ich hab ehrlich gesagt auch keine Ahnung von varargs und bitfields
), sondern zwei Ergänzungen:
groovemaster2002 schrieb:
char ist mit einem Wertebereich von -128 bis 127 definiert.
Und selbst das ist implementierungsabhängig.
#define asizeof(a) (sizeof(a) / sizeof(a[0])) // array size of (number of array elements)
Das geht in C++ schöner:
template<typename T, std::size_t Len> inline std::size_t lengthof(const (T&)[Len]) { return Len; }
-
Danke an alle