int vector in char vector



  • Gibt es denn einen Mikrocontroller, dessen Bytes 16 Bit breit sind? Der C-Standard garantiert nämlich, dass int mindestens -32768 bis 32767 darstellen kann.


  • Mod

    seldon schrieb:

    Gibt es denn einen Mikrocontroller, dessen Bytes 16 Bit breit sind? Der C-Standard garantiert nämlich, dass int mindestens -32768 bis 32767 darstellen kann.

    Es gibt Maschinen bei denen CHAR_BIT>8 ist, sogar >16. Aber gewöhnlicherweise sind deren ints natürlich auch noch einmal größer.

    Von der Kombination sizeof(char)==sizeof(int) habe ich jedenfalls noch nie gehört. Bin aber auch nicht wirklich Experte darin.



  • SeppJ schrieb:

    Von der Kombination sizeof(char)==sizeof(int) habe ich jedenfalls noch nie gehört. Bin aber auch nicht wirklich Experte darin.

    Musst du ja auch nicht, und ich auch nicht. Es hat ja imho auch wenig Sinn, ständig darauf zu pochen, was laut Standard theoretisch alles vorkommen kann, wenn man doch eigentlich nie solche exotischen Varianten zu Gesicht bekommt (was für die meisten gelten dürfte).



  • _matze schrieb:

    Es hat ja imho auch wenig Sinn, ständig darauf zu pochen, was laut Standard theoretisch alles vorkommen kann, wenn man doch eigentlich nie solche exotischen Varianten zu Gesicht bekommt (was für die meisten gelten dürfte).

    Ja klar! Ich hab dich oben schlecht zitiert, mir ist es nur um das weil ein char nunmal viel kleiner ist als ein int gegangen. Das war mir eine Spur zu apodiktisch.
    🙂



  • Ich habe ein int array von 1024 elementen.

    int buffer[1024];
    to
    char buffer1[?];

    Jetzt möchte ich die Daten per send(); senden, dabei müssen sie aber in ein char Vektor.



  • Nein, muessen sie nicht.



  • Passen deine int-Werte verlustfrei in den char-Wertebereich?
    Was erwartet deine Empfängerseite denn?



  • Die int Werte können auch 0xffffffff sein.



  • Für verlustfreie Übertragung musst du somit mit htonl auf Sende- und ntohl auf Empfängerseite arbeiten, d.h. dein int-Array entsprechend umwandeln bevor du es sendest. Mit einem char-Array aus deiner Ausgangsfrage hat das dann natürlich nichts mehr zu tun.
    hton*/ntoh* sind zwar kein ANSI aber immerhin POSIX, dass sollte deine Bibliothek kennen.



  • tam+ schrieb:

    Ich habe ein int array von 1024 elementen.

    int buffer[1024];
    to
    char buffer1[?];

    Jetzt möchte ich die Daten per send(); senden, dabei müssen sie aber in ein char Vektor.

    Der send-Funktion ist es egal ob die Daten int oder char ist. Sie möchte nur einen Zeiger auf den Anfang des zu sendenden Datenblocks haben. (Und die Anzahl)
    Ein Meckern des Compilers kannst du durch casting entgehen.
    Beachten musst du aber das ein int größer als ein char ist. (s. oben)

    #define FELD_LEN 1024
    
    int feld[FELD_LEN];
    send(fd,(char *)feld, FELD_LEN * sizeof(int),0);
    

    @tam+
    Wenn es nicht auf die Bits sondern nur auf den Wert ankommt ist 0xffffffff = -1.



  • DirkB schrieb:

    Wenn es nicht auf die Bits sondern nur auf den Wert ankommt ist 0xffffffff = -1.

    Oder auch nicht.
    🙂



  • mngbd schrieb:

    Oder auch nicht.
    🙂

    Gut OK ich habe das Zitat vergessen:

    tam+ schrieb:

    Die int Werte können auch 0xffffffff sein.

    Da steht int. Und ja gut es sollten dann auch 32-bit Integers sein. 😉
    Und die ganzen Ausnahmen und Möglichkeiten sind hier ja schon abgehandelt. 🙂



  • SeppJ schrieb:

    Von der Kombination sizeof(char)==sizeof(int) habe ich jedenfalls noch nie gehört. Bin aber auch nicht wirklich Experte darin.

    Hier mal ein Beispiel: http://focus.ti.com/lit/ug/spru514c/spru514c.pdf (Seite 82).



  • DirkB schrieb:

    Gut OK ich habe das Zitat vergessen:

    tam+ schrieb:

    Die int Werte können auch 0xffffffff sein.

    Da steht int. Und ja gut es sollten dann auch 32-bit Integers sein. 😉

    Und alle negativen 32-Bit-ints müssen im Zweierkomplement dargestellt werden?
    🙂



  • mngbd schrieb:

    DirkB schrieb:

    Gut OK ich habe das Zitat vergessen:

    tam+ schrieb:

    Die int Werte können auch 0xffffffff sein.

    Da steht int. Und ja gut es sollten dann auch 32-bit Integers sein. 😉

    Und alle negativen 32-Bit-ints müssen im Zweierkomplement dargestellt werden?
    🙂

    Jetzt treibst du es aber auf die Spitze. 😃



  • _matze schrieb:

    Jetzt treibst du es aber auf die Spitze. 😃

    Nicht meine Absicht. Ich hab nur genau das vor kurzem im Standard nachgeschlagen und folgendes gefunden:

    If the sign bit is one, the value shall be
    modified in one of the following ways:
    
    -- the corresponding value with sign bit 0 is negated (sign and magnitude);
    -- the sign bit has the value -(2^N ) (two's complement);
    -- the sign bit has the value -(2^N - 1) (ones' complement ).
    
    Which of these applies is implementation-defined, as is whether the value with sign bit
    and all value bits zero (for the first two), or with sign bit and all value bits (for ones’
    complement), is a trap representation or a normal value. In the case of sign and
    magnitude and ones’ complement, if this representation is a normal value it is called a
    negative zero.
    

    Vielleicht hat Tim noch einen Link.
    🙂

    Edit:
    Das N soll natürlich ein Exponent sein.



  • Garnicht mal. Zum Beispiel war das Einerkomplement auf frühen PDPs gebräuchlich, und auf UNIVACs noch bis in die Achtziger Jahre. Es gab auch Rechner - beispielsweise die IBM 7000-Reihe - die eine Vorzeichen-und-Betrag-Darstellung benutzten, worin -1 dann

    1000 0000 0000 0001
    

    war. Man hat auch über ganz andere Darstellungen nachgedacht, etwa gab es in Russland in den späten Fünfzigern einen Computer, der "balanced ternary" benutzte, worin eine Ziffer die Werte -1, 0 und 1 annehmen konnte. Anscheinend lassen Vergleiche sich darin schneller durchführen.

    Wer weiß, was auf uns zukommt, wenn Quantencomputer verfügbar werden.



  • mngbd schrieb:

    Vielleicht hat Tim noch einen Link.

    seldon schrieb:

    Garnicht mal.
    ...

    Oder jemand anderes.
    🙂



  • Wenn euch das Thema interessiert, Donald Knuth hat im zweiten Band von "The Art of Computer Programming" ein ziemlich spannendes Kapitel über Zahlensysteme und warum man auf die Idee kommen könnte, sie zu benutzen. Basis -2, beispielsweise. Oder auch Basis sqrt(2) * i, oder i - 1.

    "Balanced ternary" bezeichnet er als "perhaps the prettiest number system of all", und hofft geradezu, dass es große Bedeutung erlangen könne, wenn der Flip-Flop durch einen hypothetischen Flip-Flap-Flop ersetzt werde.

    Das Wildeste von alledem ist aber die Verallgemeinerung auf "mixed-radix systems", d.h. Zahlensysteme, deren Basis stellenabhängig ist. Etwa bn = n + 2, womit jede Zahl als

    cnn! + cn-1(n - 1)! + ... + c2 2! + c1

    mit 0 <= ck <= k für 1 <= k <= n und cn > 0 dargestellt werden kann.

    Wenn man mathematisch veranlagt ist, ist das Buch echt zu empfehlen. Wenn nicht, hat es deutlich mehr als sieben Siegel. Das ist eins der einfacher verständlichen Kapitel. 😉



  • Ich würde auch nur Links zu aktuellen praktisch relevanten Dingen haben 😉


Anmelden zum Antworten