Spécifiez un nombre littéral de 8 bits?

unsigned char ascii; int a = 0; char ssortingng[4] =  unsigned char ascii; int a = 0; char ssortingng[4] = "toto" ; "A1" ascii = (ssortingng[a] - 'A' + 10) * 16; ; "A1" ascii = (ssortingng[a] - 'A' + 10) * 16; 

warning: la conversion de ‘int’ en ‘unsigned char’ peut altérer sa valeur

Il semble que gcc considère les caractères et les littéraux numériques comme int par défaut. Je sais que je pourrais simplement convertir l’expression en (unsigned char), mais comment puis-je spécifier des littéraux de caractères et des nombres numériques en 8 bits sans transtypage?

Un problème similaire:

Les fractions littérales sont considérées comme doubles par défaut, mais elles peuvent être spécifiées pour flotter de la manière suivante:

 3.1f 

Par conséquent, 3.1 serait considéré comme un float plutôt qu’un double.

En C , vous ne pouvez pas faire de calculs dans des valeurs inférieures à int

 char a = '8' - '0'; /* '8' is int */ char a = (char)'8' - '0'; /* (char)'8' is converted to `int` before the subtraction */ char a = (char)'8' - (char)'0'; /* both (char)'8' and (char)'0' are converted */ 

Le langage C ne fournit aucun moyen de spécifier un littéral de type char ou unsigned char . Utilisez le casting.

Soit dit en passant, le résultat de votre calcul est en dehors de la plage des caractères unsigned char . L’avertissement est donc tout à fait correct. La conversion modifiera sa valeur. C ne fournit pas d’arithmétique dans tout type plus petit qu’un int . Dans ce cas, je suppose que ce que vous voulez, c’est de l’arithmétique modulo-256, et je pense que gcc le reconnaîtra et n’émettra pas l’avertissement avec les conversions en place. Mais en ce qui concerne le langage C, ce calcul est effectué dans le type le plus grand, puis converti en caractère unsigned char pour stockage dans ascii .

Vous pouvez spécifier des littéraux de caractère, de type char int ( char en C ++), avec des nombres spécifiques à l’aide d’une notation octale ou hexadécimale. Par exemple, \012 est un octal 12 ou un nombre décimal 10. Vous pouvez également écrire '\x0a' pour signifier la même chose.

Cependant, même si vous exécutiez cette opération (et que le calcul ne débordait pas), l’avertissement ne serait peut-être pas supprimé, car le langage C spécifie que tous les opérandes sont promus à au moins int (ou unsigned int , en fonction du type d’opérande ) avant que le calcul ne soit terminé.