Antworten:
Es ist ein mehrstelliges Literal. 1952805748
ist 0x74657374
, das zerfällt als
0x74 -> 't'
0x65 -> 'e'
0x73 -> 's'
0x74 -> 't'
Bearbeiten:
C ++ Standard, §2.14.3 / 1 - Zeichenliterale
(...) Ein gewöhnliches Zeichenliteral, das mehr als ein c-Zeichen enthält, ist ein Mehrzeichenliteral. Ein Multicharacter-Literal hat den Typ int und einen implementierungsdefinierten Wert.
sizeof(int)
die Implementierung definiert ist. Es wird also nicht nur die Implementierung der Speicherreihenfolge definiert, sondern auch deren maximale Länge.
Nein, es ist keine Adresse. Es ist das sogenannte Multibyte-Zeichen.
In der Regel sind dies die ASCII-Werte der vier Zeichen zusammen.
't' == 0x74; 'e' == 0x65; 's' == 0x73; 't' == 0x74;
0x74657374 ist also 1952805748.
Es kann aber auch 0x74736574 auf einem anderen Compiler sein. Die C- und C ++ - Standards besagen beide, dass der Wert von Multibyte-Zeichen durch die Implementierung definiert ist . Daher wird generell dringend von seiner Verwendung abgeraten.
int
halte ich es nicht für sinnvoll, mehr als 4 Bytes zu verwenden , da auf den meisten Computern 4 Bytes vorhanden sind. Ja, es sollte eine bequeme Möglichkeit sein, einige Konstanten zu schreiben, aber leider haben verschiedene Compiler sie unterschiedlich interpretiert, so dass heutzutage die meisten Codierungsstile von ihrer Verwendung abraten.
==
sollte überprüfen
Ein gewöhnliches Zeichenliteral, das mehr als ein c-Zeichen enthält, ist ein Mehrzeichenliteral. Ein Multicharacter-Literal hat den Typ int und einen implementierungsdefinierten Wert.
Implementierungsdefiniertes Verhalten muss von der Implementierung dokumentiert werden. Zum Beispiel in gcc finden Sie es hier
Der Compiler bewertet eine mehrstellige Zeichenkonstante jeweils für ein Zeichen, wobei der vorherige Wert um die Anzahl der Bits pro Zielzeichen verschoben und dann im Bitmuster des neuen Zeichens auf die Breite eines Ziels gekürzt wird Charakter. Das endgültige Bitmuster erhält den Typ int und ist daher signiert, unabhängig davon, ob einzelne Zeichen signiert sind oder nicht.
Weitere Informationen finden Sie in der Erklärung auf dieser Seite
Sie sind wirklich nur int
s. Sie werden häufig in den Core Audio API-Enums verwendet, z. B. in der CoreAudioTypes.h
Header-Datei.
enum
{
kAudioFormatLinearPCM = 'lpcm',
kAudioFormatAC3 = 'ac-3',
kAudioFormat60958AC3 = 'cac3',
kAudioFormatAppleIMA4 = 'ima4',
kAudioFormatMPEG4AAC = 'aac ',
kAudioFormatMPEG4CELP = 'celp',
} ;
Es wird viel darüber geredet, dass dies nicht "plattformunabhängig" ist, aber wenn Sie eine API verwenden, die für eine bestimmte Plattform erstellt wurde, ist Portabilität wichtig. Die Überprüfung der Gleichheit auf derselben Plattform wird niemals fehlschlagen. Diese enum
Werte sind leichter zu lesen und enthalten tatsächlich ihre Identität in ihrem Wert , was ziemlich nett ist.
Was ich unten versucht habe, ist ein Multibyte-Zeichenliteral einzuwickeln, damit es gedruckt werden kann (auf dem Mac funktioniert dies). Das Seltsame ist, wenn Sie nicht alle 4 Zeichen verbrauchen, wird das Ergebnis unten falsch.
#include <stdio.h>
#define MASK(x,BYTEX) ((x&(0xff<<8*BYTEX))>>(8*BYTEX))
struct Multibyte
{
union{
int val ;
char vals[4];
};
Multibyte() : val(0) { }
Multibyte( int in )
{
vals[0] = MASK(in,3);
vals[1] = MASK(in,2);
vals[2] = MASK(in,1);
vals[3] = MASK(in,0);
}
char operator[]( int i ) {
return val >> (3-i)*8 ; // works on mac
//return val>>i*8 ; // might work on other systems
}
void println()
{
for( int i = 0 ; i < 4 ; i++ )
putc( vals[i], stdout ) ;
puts( "" ) ;
}
} ;
int main(int argc, const char * argv[])
{
Multibyte( 'abcd' ).println() ;
Multibyte( 'x097' ).println() ;
Multibyte( '\"\\\'\'' ).println() ;
Multibyte( '/*|' ).println() ;
Multibyte( 'd' ).println() ;
return 0;
}
Diese Art von Funktion ist wirklich gut, wenn Sie Parser erstellen. Bedenken Sie:
byte* buffer = ...;
if(*(int*)buffer == 'GET ')
invoke_get_method(buffer+4);
Dieser Code funktioniert wahrscheinlich nur für bestimmte Endianess und kann über verschiedene Compiler hinweg funktionieren