C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Konversion char <-> (un)signed char
Goto page 1, 2  Next
 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Markus Moll
Guest





PostPosted: Thu Sep 09, 2004 1:23 pm    Post subject: Konversion char <-> (un)signed char Reply with quote



Hallo

Ich grüble im Moment darüber, wie man korrekt zwischen den char Typen
konvertieren kann.
Konkret möchte ich einen 32 bit int in bytes zerlegen und diese einheitlich
(gegebene Endianness) in einen string packen. Jedoch habe ich etwas
Schwierigkeiten mit der Interpretation des Standards.
Es ist garantiert, daß alle char Typen gleich groß sind und gleiches
alignment haben. Des weiteren hat "char" denselben Wertebereich wie
entweder "unsigned char" oder "signed char". Leider ist "char" allerdings
weder signed noch unsigned, daher greifen die Konvertierungsregeln aus 4
nicht.

Ist folgendes korrekt:

(Annahme: #include <stdint.h> (jaja, C99) und 8bit char)

uint16_t i = -32768;
char arr[2];
char[1] = static_cast<char>( static_cast<unsigned char>( i & 0xff ) );
char[0] = static_cast<char>( static_cast<unsigned char>( (i>>Cool & 0xff ) );

oder muß ich den Umweg über reinterpret_cast nehmen (so sehe ich das im
Moment), d.h.:

uint16_t i = -32768;
char arr[2];
unsigned char tmp;
tmp = static_cast<unsigned char>( i & 0xff );
char[1] = *reinterpret_cast<char*>( &tmp );
tmp = static_cast<unsigned char>( (i>>Cool & 0xff );
char[0] = *reinterpret_cast<char*>( &tmp );

Letzteres müßte häßlich, aber auf jeden Fall richtig sein, oder?

Danke schonmal
Gruß
Markus

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Markus Schaaf
Guest





PostPosted: Thu Sep 09, 2004 2:03 pm    Post subject: Re: Konversion char <-> (un)signed char Reply with quote



"Markus Moll" <moll.markus (AT) arcor (DOT) de> schrieb:

Quote:
Ich grüble im Moment darüber, wie man korrekt zwischen den char Typen
konvertieren kann.

Direkt und implizit, ohne jede Verrenkung. Die Bitmuster sind für
positive Werte identisch und für die negativen ist die Abbildung
auf die überzähligen positiven bijektiv.

Quote:
Konkret möchte ich einen 32 bit int in bytes zerlegen und diese einheitlich
(gegebene Endianness) in einen string packen.


char* WriteBE( char* s, unsigned v )
{
s[0] = (unsigned char) ( v >> 24 );
s[1] = (unsigned char) ( v >> 16 );
s[2] = (unsigned char) ( v >> 8 );
s[3] = (unsigned char) ( v );
return s + 4;
}

"Richtiger" wäre ein »static_cast«, aber ich hasse diese Tiporgien.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Thomas Dorner
Guest





PostPosted: Thu Sep 09, 2004 5:20 pm    Post subject: Re: Konversion char <-> (un)signed char Reply with quote



Hallo Markus!

MM>Ich grüble im Moment darüber, wie man korrekt zwischen den char Typen
MM>konvertieren kann.

MM>uint16_t i = -32768;

Huch, unsigned mit negativem Wert initialisieren? Na meinetwegen.

Spricht etwas gegen eine union zur Konvertierung?

uint16_t i = -32768;
char arr[2];
union {
uint16_t i;
char c[2];
} conv;
arr[0] = conv.c[0];
arr[1] = conv.c[1];

oder kurz

union {
uint16_t i;
char c[2];
} conv = { -32768 };
char arr[2] = { conv.c[0], conv.c[1] };

Viele Grüße, Thomas
--
From-Adresse wird nicht genutzt, Reply-To Adresse gilt nur 4 Wochen!

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Stefan Reuther
Guest





PostPosted: Thu Sep 09, 2004 6:33 pm    Post subject: Re: Konversion char <-> (un)signed char Reply with quote

Markus Schaaf wrote:
Quote:
"Markus Moll" <moll.markus (AT) arcor (DOT) de> schrieb:
Ich grüble im Moment darüber, wie man korrekt zwischen den char Typen
konvertieren kann.

Direkt und implizit, ohne jede Verrenkung. Die Bitmuster sind für
positive Werte identisch und für die negativen ist die Abbildung
auf die überzähligen positiven bijektiv.

In der Praxis ja.

In der Theorie gibt es für die Konvertierung signed->unsigned eine
Vorschrift (wie Zweierkomplement, also -32767 -> 0x8001); für die
Gegenrichtung jedoch nicht.

# If the destination type is signed, the value is unchanged if it can be
# represented in the destination type (and bitfield width); otherwise,
# the value is implementationdefined.
(4.7p3)

Warum diese Inkonsistenz existiert, weiß ich nicht.

Quote:
Konkret möchte ich einen 32 bit int in bytes zerlegen und diese einheitlich
(gegebene Endianness) in einen string packen.

char* WriteBE( char* s, unsigned v )
{
s[0] = (unsigned char) ( v >> 24 );
s[1] = (unsigned char) ( v >> 16 );
s[2] = (unsigned char) ( v >> 8 );
s[3] = (unsigned char) ( v );
return s + 4;
}

Würde ich genauso machen. Ich kenne kein System, auf dem das nicht tut.


Stefan

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Markus Moll
Guest





PostPosted: Thu Sep 09, 2004 6:33 pm    Post subject: Re: Konversion char <-> (un)signed char Reply with quote

Hallo

Thomas Dorner wrote:

Quote:
MM>Ich grüble im Moment darüber, wie man korrekt zwischen den char Typen
MM>konvertieren kann.

MM>uint16_t i = -32768;

Huch, unsigned mit negativem Wert initialisieren? Na meinetwegen.

Da habe ich gepennt, natürlich meinte ich int16_t.

Quote:
Spricht etwas gegen eine union zur Konvertierung?

Ja. Sowas macht man nicht (cf. Stroustrup und vermutlich die halbe
Welt). ;-)

Gruß
Markus

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Markus Moll
Guest





PostPosted: Thu Sep 09, 2004 6:48 pm    Post subject: Re: Konversion char <-> (un)signed char Reply with quote

Hallo

Erst jetzt fällt mir auf, daß ich eine wichtige Bedingung vergessen habe.
Das ganze geschieht im Rahmen eines Netzwerkprotokolls, ich möchte also
gerne den Kram verschicken und nachher auf einer anderen Maschine wieder
zusammenbasteln. (Daher hilft mir alles, wo in der Umwandlung irgendwann
"implementation defined" auftritt, auch nicht weiter)

Markus Schaaf wrote:

Quote:
Direkt und implizit, ohne jede Verrenkung. Die Bitmuster sind für
positive Werte identisch und für die negativen ist die Abbildung
auf die überzähligen positiven bijektiv.

Das ist die Umwandlung "char" -> "unsigned char"? Mir ist das nur für
"signed char" -> "unsigned char" bewußt, da das in Abschnitt 4 der C++-Norm
klar geregelt ist (kleinster Wert modulo 2^n etc...).
Wo steht denn, daß das tatsächlich so ist?

Schlimmer noch bei "unsigned char" -> "char" oder "unsigned char" -> "signed
char" (okay, letzteres ist kein Fall, der in meinem ursprünglichen Posting
vorkam) Alles, was ich lese, bezieht sich auf das Kopieren in char-Arrays,
und wie erwähnt greift keine einzige Konversions-/Promotionsregel in
Abschnitt 4.

Gruß
Markus

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Markus Schaaf
Guest





PostPosted: Thu Sep 09, 2004 8:55 pm    Post subject: Re: Konversion char <-> (un)signed char Reply with quote

"Stefan Reuther" <stefan.news (AT) arcor (DOT) de> schrieb:

Quote:
Markus Schaaf wrote:

Direkt und implizit, ohne jede Verrenkung. Die Bitmuster sind für
positive Werte identisch und für die negativen ist die Abbildung
auf die überzähligen positiven bijektiv.

In der Praxis ja.

Nicht nur. Die Bijektivität ist garantiert, nur müssen die C++-Casts
von »signed char« nach »unsigned char« und zurück nicht komplementäre
Funktionen sein. Strenggenommen ist man nur "sicher", wenn man die
Zeiger über »void*« castet:

char* PutBE( char* s_, unsigned v )
{
unsigned char* s = (unsigned char*) (void*) s_;
s[0] = (unsigned char) ( v >> 24 );
s[1] = (unsigned char) ( v >> 16 );
s[2] = (unsigned char) ( v >> 8 );
s[3] = (unsigned char) ( v );
return (char*) (void*) ( s + 4 );
}

Im Sinne des OP ist das wohl die bessere Antwort.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Markus Schaaf
Guest





PostPosted: Thu Sep 09, 2004 9:28 pm    Post subject: Re: Konversion char <-> (un)signed char Reply with quote

"Markus Moll" <moll.markus (AT) arcor (DOT) de> schrieb:

Quote:
Erst jetzt fällt mir auf, daß ich eine wichtige Bedingung vergessen habe.
Das ganze geschieht im Rahmen eines Netzwerkprotokolls, ich möchte also
gerne den Kram verschicken und nachher auf einer anderen Maschine wieder
zusammenbasteln. (Daher hilft mir alles, wo in der Umwandlung irgendwann
"implementation defined" auftritt, auch nicht weiter)

Hat man dabei nicht sowieso Nebenbedingungen, die das alles
vereinfachen? Ich meine, Du mußt die Bits/Bytes, die über die
Leitung gehen doch irgendwie definieren (C++ hilft Dir dabei
ja sowieso nicht). Ich habe den Eindruck, Du suchst die
fehlende Spezifikation des Netzwerkprotokolls in der Program=
miersprache.

Wenn Du bespielsweise Text verschicken willst, mußt Du einen
Zeichensatz und eine Kodierung festlegen. Nimmst Du ASCII,
hast Du Zahlen von 0 bis 127. Inwieweit das mit einem Zeichen=
satz und Kodierung auf Deiner Plattform korrespondiert, mußt
Du selbst herausfinden. C++ hilft Dir dabei nicht. Ob die APIs
Deiner Plattform an diesen Stellen »char« oder »char*« oder
was anderes verarbeiten (z.B. »wchar_t*«), entnimmst Du der
zugehörigen Dokumentation. Ebenso bei den Netzwerkfunktionen.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Markus Moll
Guest





PostPosted: Thu Sep 09, 2004 9:49 pm    Post subject: Re: Konversion char <-> (un)signed char Reply with quote

Hallo

Markus Schaaf wrote:

Quote:
Nicht nur. Die Bijektivität ist garantiert,

Kann man das aus "... occupy the same amount of storage" und "... all bits
of the object representation participate in the value representation"
schließen? (Heißt das nicht nur, daß kein Bit "unbedeutend" ist? Könnte es
nicht trotzdem sein, daß zum Beispiel der char vorzeichenbehaftet mit
Vorzeichen-Betrag-Darstellung ist, aber aus skurrilen Gründen die -0 nicht
darstellen kann, daß also folgendes pattern (8bit): 1000 0000 keinen
char-Wert darstellt (wohl aber 0000 0000, daher ist auch das oberste Bit
Teil der value representation) und würde ein static_cast dann nicht
_niemals_ einen Wert 1000 0000 produzieren, weswegen die Abbildung gar
nicht bijektiv sein kann?)

Ich gebe übrigens zu, daß das alles konstruiert und reichlich theoretisch
ist :-)

Quote:
nur müssen die C++-Casts
von »signed char« nach »unsigned char« und zurück nicht komplementäre
Funktionen sein. Strenggenommen ist man nur "sicher", wenn man die
Zeiger über »void*« castet:

Wieso der Umweg über (void*) (mal davon abgesehen, daß ich die C-casts nicht
mag, weil man nie wirklich weiß, was genau jetzt passiert)?
Es dürfte reichen, wenn man reinterpret_cast<unsigned char*>(s_) nimmt,
oder? Und ist das dann gesund, wenn man in s_ nachher Werte stehen hat, die
eventuell gar keinen char-Wert darstellen? Darf man s_ danach überhaupt
noch ansehen, oder erst wieder, nachdem man wieder in unsigned char*
zurückgecastet hat?

Gruß
Markus

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Markus Moll
Guest





PostPosted: Thu Sep 09, 2004 10:35 pm    Post subject: Re: Konversion char <-> (un)signed char Reply with quote

Hi

Markus Schaaf wrote:

Quote:
Hat man dabei nicht sowieso Nebenbedingungen, die das alles
vereinfachen? Ich meine, Du mußt die Bits/Bytes, die über die
Leitung gehen doch irgendwie definieren (C++ hilft Dir dabei
ja sowieso nicht). Ich habe den Eindruck, Du suchst die
fehlende Spezifikation des Netzwerkprotokolls in der Program=
miersprache.

Nicht ganz. Gehen wir mal von einer Netzwerkimplementierung aus, die Bytes
von Rechner A nimmt, in ein Netzwerkformat packt, das die Werte der
Ausgangsplattform widerspiegelt, über das Netzwerk verschickt und auf einem
anderen Rechner B wieder (unter Beibehaltung der Werte) in die dortige
Darstellung überführt. Hier würden (sofern die beiden Plattformen das
technisch überhaupt erlauben) alle Byte-Werte beibehalten.
Trotzdem müßte ich meinen int jetzt irgendwie so in bytes zerlegen, daß alle
Information auch sicher wenigstens bis zur Netzwerk-API kommen (alles
weitere liegt sowieso außerhalb meines Einflußbereichs). Wenn mir das
gelänge, könnte ich allerdings mit denselben Operationen rückwärts den Wert
des ints auf B wieder rekonstruieren (obwohl die Repräsentation
möglicherweise vollkommen unterschiedlich ist).

Nachdem ich gerade lese, daß auch
int i=-6;
i >>= 8;
implementierungsabhängig ist, möchte ich mich mal auf unsigned Typen
beschränken. Dann wird aber klar, daß der Ansatz, die Daten überhaupt in
ein char-Array zu packen, schlicht falsch ist, da sie in ein unsigned
char-Array gehören. Und ich glaube, dann habe ich plötzlich keine Probleme
mehr, weil dann alle Operationen (inklusive der casts von unsigned some_int
nach unsigned char) rein über Werte definiert sind und die interne
Repräsentation wegabstrahiert ist, was eindeutige Ergebnisse ermöglicht.

Ob meine Netzwerkimplementierung so freundlich ist, wie ich das annehme (im
konkreten Fall POSIX/Linux, aber huch, jetzt wird es plattformabhängig,
also bitte schnell wieder vergessen Wink ), steht dabei auf einem ganz
anderen Blatt.

Gruß
Markus

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Hendrik Sattler
Guest





PostPosted: Thu Sep 09, 2004 10:51 pm    Post subject: Re: Konversion char <-> (un)signed char Reply with quote

Thomas Dorner wrote:
Quote:
union {
uint16_t i;
char c[2];
} conv = { -32768 };
char arr[2] = { conv.c[0], conv.c[1] };

Kommt da bei little-endian und big-endian dasselbe raus?

HS

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Markus Schaaf
Guest





PostPosted: Fri Sep 10, 2004 7:57 am    Post subject: Re: Konversion char <-> (un)signed char Reply with quote

"Markus Moll" <moll.markus (AT) arcor (DOT) de> schrieb:

Quote:
beschränken. Dann wird aber klar, daß der Ansatz, die Daten überhaupt in
ein char-Array zu packen, schlicht falsch ist, da sie in ein unsigned
char-Array gehören. Und ich glaube, dann habe ich plötzlich keine Probleme
mehr, weil dann alle Operationen (inklusive der casts von unsigned some_int
nach unsigned char) rein über Werte definiert sind und die interne
Repräsentation wegabstrahiert ist, was eindeutige Ergebnisse ermöglicht.

Ack.

Quote:
Ob meine Netzwerkimplementierung so freundlich ist, wie ich das annehme (im
konkreten Fall POSIX/Linux, aber huch, jetzt wird es plattformabhängig,
also bitte schnell wieder vergessen Wink ), steht dabei auf einem ganz
anderen Blatt.

Das ist letztlich nicht so tragisch: Auch wenn die Funktionen irgendwo
irrigerweise »char*« nehmen sollten, sich aus der Doku aber ergibt, daß
die Bytes dahinter als »unsigned char« behandelt werden, castet Du eben
Zeiger. (Was korrekt nur über »void*« geht -- siehe deshalb etwa »memcpy«
-- aber auf einer bestimmten Plattform auch mit anderen Casts funktio=
nieren kann.)

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
kanze@gabi-soft.fr
Guest





PostPosted: Fri Sep 10, 2004 1:17 pm    Post subject: Re: Konversion char <-> (un)signed char Reply with quote

"Markus Schaaf" <markus (AT) sags-per-mail (DOT) de> wrote

Quote:
"Markus Moll" <moll.markus (AT) arcor (DOT) de> schrieb:

Ich grüble im Moment darüber, wie man korrekt zwischen den char
Typen konvertieren kann.

Direkt und implizit, ohne jede Verrenkung. Die Bitmuster sind für
positive Werte identisch und für die negativen ist die Abbildung auf
die überzähligen positiven bijektiv.

Woher kriegst Du das aus? Ich habe immer gelesen, dass das Ergebnis
einer Umwandlung nach signed implementierungsabhängig ist, falls der
Wert nicht darstellbar ist. In der C-Norm steht sogar explizit
geschrieben, dass es zu einem Signal führen kann.

In der Praxis ist der Fall von char ein bisschen besonders. Endlich ist
es (in C in jedem Fall) äußersts gänglich, so etwas zu schreiben:

int c = getc( source ) ;
while ( c != EOF && andereKriteria( c ) ) {
*p ++ = c ; // Wo p char* ist.
}

Ich glaube nicht, dass eine Implementierung es wagt, solchen Code kaputt
zu machen, auch wenn er laut Norm schon falsch ist. Falls die Umwandlung
eines Wertes im Bereich 0...UCHAR_MAX zu signed char ein Problem
darstellen könnte, bin ich sicher, dass die Implementierung char als
unsigned char implementiert, um das Problem umzugehen.

Quote:
Konkret möchte ich einen 32 bit int in bytes zerlegen und diese
einheitlich (gegebene Endianness) in einen string packen.

char* WriteBE( char* s, unsigned v )
{
s[0] = (unsigned char) ( v >> 24 );
s[1] = (unsigned char) ( v >> 16 );
s[2] = (unsigned char) ( v >> 8 );
s[3] = (unsigned char) ( v );
return s + 4;
}

Ich möchte zuerst den genauen Ziel wissen, bevor ich eine Lösung
vorschlage. Ist der Ziel in der Tat nach char zu gehen, dann much die
Verschiebung von 3*CHAR_BIT, 2*CHAR_BIT und CHAR_BIT sein. Wenn aber der
Ziel ist, in 8-Bit Stückeln aufzulegen (z.B. zum Übertragen auf dem
Netz), dann schreibe ich lieber:

s[ 0 ] = ( v >> 24 ) & 0xff ;
s[ 1 ] = ( v >> 16 ) & 0xff ;
s[ 2 ] = ( v >> 8 ) & 0xff ;
s[ 3 ] = ( v ) & 0xff ;

Quote:
"Richtiger" wäre ein »static_cast«, aber ich hasse diese Tiporgien.

Na ja, bei arithmetischen Typen bin ich halbweise deiner Meinung. Jeder
schreibe »MeineKlasse( initWert )«. Warum dann nicht »int( initWert )«?

--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Thomas Dorner
Guest





PostPosted: Fri Sep 10, 2004 1:19 pm    Post subject: Re: Konversion char <-> (un)signed char Reply with quote

Hallo Hendrik!

HS>Kommt da bei little-endian und big-endian dasselbe raus?

Nein, kommt nicht, das mit dem Netzwerkprotokoll habe ich erst später
gelesen.

Aber in so einem allgemeinen Fall würde ich mir eher irgendeine
Bibliothek nehmen, die das für mich erledigt. Für Netzwerkprotokolle
z.B. irgendeinen Corba ORB, dann spezifiziere ich in IDL und der ORB
kümmert sich um das Marshalling (und optimiert es ggf. weg, falls ich
mich auf der gleichen Maschine bewege).

Viele Grüße, Thomas
--
From-Adresse wird nicht genutzt, Reply-To Adresse gilt nur 4 Wochen!

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
kanze@gabi-soft.fr
Guest





PostPosted: Fri Sep 10, 2004 1:23 pm    Post subject: Re: Konversion char <-> (un)signed char Reply with quote

"Markus Schaaf" <markus (AT) sags-per-mail (DOT) de> wrote


Quote:
"Stefan Reuther" <stefan.news (AT) arcor (DOT) de> schrieb:

Markus Schaaf wrote:

Direkt und implizit, ohne jede Verrenkung. Die Bitmuster sind für
positive Werte identisch und für die negativen ist die Abbildung
auf die überzähligen positiven bijektiv.

In der Praxis ja.

Nicht nur. Die Bijektivität ist garantiert, nur müssen die C++-Casts
von »signed char« nach »unsigned char« und zurück nicht komplementäre
Funktionen sein.

Es ist erlaubt, dass der Compiler beim nicht passenden Werten immer 0
ergibt, z.B. Oder dass er einen Signal auflöst.

Quote:
Strenggenommen ist man nur "sicher", wenn man die Zeiger über »void*«
castet:

Der void* spielt in diesem Fall keine Rolle.

Quote:
char* PutBE( char* s_, unsigned v )
{
unsigned char* s = (unsigned char*) (void*) s_;

Oder direkt (unsigned char*)s_.

Quote:
s[0] = (unsigned char) ( v >> 24 );
s[1] = (unsigned char) ( v >> 16 );
s[2] = (unsigned char) ( v >> 8 );
s[3] = (unsigned char) ( v );
return (char*) (void*) ( s + 4 );
}

Im Sinne des OP ist das wohl die bessere Antwort.

Wenn es entspricht, was er haben will. Ich bin aber skeptisch, dass er
auf einem Rechner mit 9-Bit char bekommt, was er haben will.

--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.