Bonjour,

Je suis en train de passer un outil sur des sources en C.
Une opération de bits (>>, <<, &, |, ~...) sur un nombre signé provoque une erreur. J'aimerais supprimer cette erreur.
J'ai dans l'idée de récupérer les bits de la variable signée pour les assigner à une variable non signée et ensuite faire mes comparaison de bits, comment faut-il que je fasse ?

J'ai fait un petit programme, qui me permet de faire des essais sur des nombre signés et l'utilisation de cast, mais je ne sais pas si un cast est suffisant pour tous les cas :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
/* Dans ce programme il y a de la manipulation de fichiers */
/* Pour compiler faire "gcc -o test test.c" */
/* Pour executer faire "exec test &" */
 
#include <stdio.h>
#include <string.h>
 
 
int main (void)
{
    char var_int ;
    unsigned char var_uint ;
    char result, result2 ;
 
    var_int = -8 ;
    var_uint = 8 ;
    printf("valeurs de base var_int:%d, var_uint:%d\n", var_int, var_uint) ;
 
	result = ((var_int >> 4) & 0x0F) | 0x30; /* LINT_NON_INTEGER */
	result2 = ((var_int << 4)& 0xF0); /* LINT_NON_INTEGER */
    printf("resultats : result:%d, result2:%d\n", result, result2) ;
 
	result = ((var_uint >> 4) & 0x0F) | 0x30; /* LINT_NON_INTEGER */
	result2 = ((var_uint << 4)& 0xF0); /* LINT_NON_INTEGER */
    printf("resultats : result:%d, result2:%d\n", result, result2) ;
 
    var_int = 0xf0 ;
    var_uint = 0xf0 ;
    printf("valeurs de base var_int:%d, var_uint:%d\n", var_int, var_uint) ;
 
	result = ((var_int >> 4) & 0x0F) | 0x30; /* LINT_NON_INTEGER */
	result2 = ((var_int << 4)& 0xF0); /* LINT_NON_INTEGER */
    printf("resultats : result:%d, result2:%d\n", result, result2) ;
 
	result = ((var_uint >> 4) & 0x0F) | 0x30; /* LINT_NON_INTEGER */
	result2 = ((var_uint << 4)& 0xF0); /* LINT_NON_INTEGER */
    printf("resultats : result:%d, result2:%d\n", result, result2) ;
 
    var_int = -8 ;
    var_uint = 8 ;
    printf("valeurs de base var_int:%d, var_uint:%d\n", ((unsigned char)var_int), var_uint) ;
 
	result = ((((unsigned char)var_int) >> 4) & 0x0F) | 0x30; /* LINT_NON_INTEGER */
	result2 = ((((unsigned char)var_int) << 4)& 0xF0); /* LINT_NON_INTEGER */
    printf("resultats : result:%d, result2:%d\n", result, result2) ;
 
	result = ((var_uint >> 4) & 0x0F) | 0x30; /* LINT_NON_INTEGER */
	result2 = ((var_uint << 4)& 0xF0); /* LINT_NON_INTEGER */
    printf("resultats : result:%d, result2:%d\n", result, result2) ;
 
    var_int = 0xf0 ;
    var_uint = 0xf0 ;
    printf("valeurs de base var_int:%d, var_uint:%d\n", ((unsigned char)var_int), var_uint) ;
 
	result = ((((unsigned char)var_int) >> 4) & 0x0F) | 0x30; /* LINT_NON_INTEGER */
	result2 = ((((unsigned char)var_int) << 4)& 0xF0); /* LINT_NON_INTEGER */
    printf("resultats : result:%d, result2:%d\n", result, result2) ;
 
	result = ((var_uint >> 4) & 0x0F) | 0x30; /* LINT_NON_INTEGER */
	result2 = ((var_uint << 4)& 0xF0); /* LINT_NON_INTEGER */
    printf("resultats : result:%d, result2:%d\n", result, result2) ;
 
	return (0) ;
}
Voici les résultats :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
valeurs de base var_int:-8, var_uint:8
resultats : result:63, result2:-128
resultats : result:48, result2:-128
valeurs de base var_int:-16, var_uint:240
resultats : result:63, result2:0
resultats : result:63, result2:0
valeurs de base var_int:-8, var_uint:248
resultats : result:63, result2:-128
resultats : result:63, result2:-128
valeurs de base var_int:240, var_uint:240
resultats : result:63, result2:0
resultats : result:63, result2:0
dites moi si c'est une bonne méthode pour supprimer les erreurs