Je suis curieux de connaître ce code :
me donne une puissance de `` .
Ma question : la sortie n’est une adresse en mémoire ou quelque chose ?
Je suis curieux de connaître ce code :
me donne une puissance de `` .
Ma question : la sortie n’est une adresse en mémoire ou quelque chose ?
Il s’agit d’un littéral de multi caractère. est
, qui se décompose comme
Edit :
C++ standard, §2.14.3/1 - littéraux de caractère
(...) Un littéral de caractère ordinaire qui contient plus d’un c-char est un multicharacter littéral. Un multicharacter littérale a valeur de type int et mise en œuvre-définie.
Non, il n’est pas une adresse. C’est le soi-disant Jeux de caractères multioctet.
En général, c’est les valeurs ASCII des quatre caractères combinés.
' t ' == 0x74 ; « e » == 0 x 65 ; de ' == 0x73 ; ' t ' == 0x74 ; 0x74657374 est donc 1952805748.
Mais il peut aussi être 0x74736574 sur un autre compilateur. Les normes C et C++ que la valeur des caractères codés sur plusieurs octets est mise en œuvre défini. Donc, généralement, son utilisation est fortement déconseillée.
Un caractère ordinaire littérale qui contient plus d'un c-char est un multicaractère littérale. Un multicaractère littérale est de type int et de mise en valeur définie.
La mise en œuvre définies comportement est nécessaire pour être documentées par la mise en œuvre. par exemple dans gcc, vous pouvez le trouver ici
Le compilateur valeurs multi-caractère caractère constant un caractère à la fois, un décalage de la valeur précédente de gauche par le nombre de bits par caractère cible, puis ou-ing dans la bit-modèle du nouveau caractère tronqué à la largeur d'un caractère cible. La finale peu-motif de type int, et est donc signé, indépendamment du fait que seul les personnages sont signés ou pas.
Vérifiez bien l'explication de cette page pour plus de détails
Ils sont vraiment int
s. Ils sont largement utilisés dans le Core Audio API enum par exemple, dans l' CoreAudioTypes.h
fichier d'en-tête,
enum
{
kAudioFormatLinearPCM = 'lpcm',
kAudioFormatAC3 = 'ac-3',
kAudioFormat60958AC3 = 'cac3',
kAudioFormatAppleIMA4 = 'ima4',
kAudioFormatMPEG4AAC = 'aac ',
kAudioFormatMPEG4CELP = 'celp',
} ;
Il y a beaucoup de choses sur ce qui n'est pas "plate-forme indépendante", mais lorsque vous êtes en utilisant une api qui est faite pour une plate-forme spécifique, qui se soucie de la portabilité. La vérification de l'égalité sur la même plate-forme ne manquera jamais. Ces enum
'les valeurs de d sont plus faciles à lire et elles en contiennent en fait de leur identité, de leur valeur, ce qui est assez agréable.
Ce que j'ai essayé de le faire ci-dessous est de conclure un caractère multi-octets littérale afin qu'elle puisse être imprimé (sur Mac cela fonctionne). La chose étrange est, si vous n'utilisez pas tous les 4 caractères, le résultat devient faux ci-dessous..
#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;
}
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.