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 :
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));
 
}
Resultat :
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
Un autre cas interessant un decalage superieure a 31m le compilateur
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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
00000000 00000000 00000000 00000000 10000000 00000000 00000000 00001001 
I = 2147483657%
Voila merci d'avoir lu et ci vous avez une explication de la doc sa serai avec grand plaisir =)
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:
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));
 
}
Avec le resultat suivant :
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