Bonjour, bonsoir.
Pour comprendre et aprendre a utiliser les operateur bit a bit, je me suis amuser a afficher les variables en base 2.
J ai commencer a bidouiller quelque decallage et sur un long (8 octect sur un x64) avec un decalage de 31,
les 32 bit suivant sont initialiser a 1. Je ne comprend pas pourquoi est j aimerai savoir si quelqu un as une explication =)
Voici mon code est l' exemple de la problematique :
Resultat :
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 #include <unistd.h> void ft_putchar(char c) { write(1, &c, 1); } void ft_print_binary(void *data, size_t size) { int i; i = 0; while(size--) { i = 0; while(i < 8) { if(*((char*)data + size) & (128 >> i)) ft_putchar('1'); else ft_putchar('0'); i++; } ft_putchar(' '); } } int main(void) { long i; ft_print_binary(&i, sizeof(i)); i = 1 << 31; ft_putchar('\n'); ft_print_binary(&i, sizeof(i)); }
Un autre cas interessant un decalage superieure a 31m le compilateur
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 11111111 11111111 11111111 11111111 10000000 00000000 00000000 00000000
m indique que mon decalage est impossible car je depasse la largeur du long.
En resumer mon sizeof mindique bien 8 octect, je peux l initialiser qu dessus de l int max,
mais aucun decalage au dessus de 32.
Int max qui d ailleur est correctement innitialiser mais mal representer :
Voila merci d'avoir lu et ci vous avez une explication de la doc sa serai avec grand plaisir =)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 00000000 00000000 00000000 00000000 10000000 00000000 00000000 00001001 I = 2147483657%
Desole pour l orthographe
Je presice que pour sont utilisation que , j ai corriger le probleme grace a un unsigned long, ainsi qu un cast du decalage.
De la maniere suivante:
Avec le resultat suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 int main(void) { unsigned long i; ft_print_binary(&i, sizeof(i)); i = (unsigned)1 << 31; ft_putchar('\n'); ft_print_binary(&i, sizeof(i)); }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 10000000 00000000 00000000 00000000
Partager