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: 4294967295

    Danke 🙂 😃 :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


Anmelden zum Antworten