2010-12-10 60 views
1

Ceci est le code de test.gcc (v4.1.2 cross-compiler) problème de promotion d'entier

char ch = 0xff; 
int i = ch; 
printf("%d\n", i); 

Dans gcc-4.4.5 i386, la sortie est -1. Mais dans powerpc-e300c3-linux-gnu-gcc-4.1.2 (compilateur croisé MPC8315), la sortie est 255.

Qu'est-ce qui ne va pas? Pourquoi la sortie gcc-4.1.2 est 255?

Merci pour votre réponse ...

+1

J'ai aussi rencontré ce problème. 'char' est" habituellement "signé, mais sur PowerPC Linux, il est non signé. Quand j'ai découvert cela, je codais sur PowerPC, et j'avais ce code: 'unsigned char charflag [256]; ... charflag [c] & CF_WHITE'. Le problème est que lorsque 'c' est un caractère de la variété non-ASCII, il en résulte des index négatifs quand' char' est signé. Le correctif était de dire 'charflag [(unsigned char) c]', car cela empêche l'extension de signe parasite. –

+2

Affecter la valeur de 255 à un caractère n'est pas une bonne idée: "Autrement, le nouveau type est signé et la valeur ne peut être représentée, le résultat est défini par l'implémentation ou un signal défini par l'implémentation est déclenché. " Vous pouvez seulement supposer que vous pouvez stocker des valeurs jusqu'à 127 dans un simple 'char'. En règle générale, n'utilisez jamais un 'char' simple pour l'arithmétique. –

Répondre

9

Il est la mise en œuvre défini si char est signé ou non signé.

Apparemment, il est signé sur votre compilateur x86 et non signé sur votre compilateur PowerPC.

Pour la portabilité, utilisez unsigned char ou signed char partout où vous vous souciez de la signature.

+1

GCC possède l'indicateur '-fsigned-char' qui force' char' à être signé sur toutes les plates-formes. C'est une bonne solution pour le portage du code, mais vous devriez toujours prendre l'habitude de voir que la signature de 'char' est définie par l'implémentation. –

+1

Ou mieux encore, si l'on se soucie vraiment de la taille des variables, mieux vaut l'énoncer explicitement. Utilisez l'en-tête stdint.h (en C99 et plus) - il a int8_t et uint8_t. Bien que je n'aime vraiment pas les '_t's. – Hexagon

+1

@Hex, 'char' est toujours 1 octet, et c'est 8 bits sur la grande majorité des systèmes modernes. En outre, vous pouvez faire typedefs sans le '_t'. –