-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathshifting.c
46 lines (37 loc) · 1.63 KB
/
shifting.c
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
#include <stdio.h>
#include <stdlib.h>
int main(void) {
/* In tutti e 3 i casi ci sara' un messaggio di warning del compilatore,
inoltre ciascun risultato sara' 0x00. Il motivo e' la lunghezza della word
a 32 bit. */
int num1 = 0xFEDCBA98 << 32; // 32 bit
int num2 = 0xFEDCBA98 >> 36; // 32 bit
unsigned num3 = 0xFEDCBA98 >> 40; // 32 bit
printf("0x%#.8x\n", num1);
printf("0x%#.8x\n", num2);
printf("0x%#.8x\n", num3);
/* In entrambi i casi '1', viene spostato sul bit piu' significativo,
per cui sara' 10000000 00000000 00000000 00000000 */
int num4 = 0x00000001 << 31; // 32 bit
unsigned num5 = 0x00000001 << 31; // 32 bit
/* I bit vengono riempiti con degli '1' se il tipo di dato e' 'int', con
degli '0' se il tipo di dato e' 'unsigned' */
num4 >>= 3; // 11110000 00000000 00000000 00000000
num5 >>= 3; // 00010000 00000000 00000000 00000000
printf(" int: %#x %10d\n", num4, num4);
printf("unsigned: %#x %10d\n", num5, num5);
// Regole di associativita'
unsigned val1 = 1;
unsigned val2 = 2;
/* Le parentesi dovrebbero essere sempre inserite qualora l'istruzione non
risultasse leggibile, ma anche per evitare i messaggi di warnings del
compilatore, come nei casi a seguire */
unsigned res1 = val1 << val2 >> 1; // (val1 << val2) >> 1
unsigned res2 = val1 << 1 + 2 << 3; // (val1 << (1 + 2)) << 3
unsigned res3 = val1 + val2 << 12 * val1 >> val2;
// ((val1 + val2) << (12 * val1)) >> valb
printf("res: %4d\n", res1);
printf("res: %4d\n", res2);
printf("res: %4d\n", res3);
return(EXIT_SUCCESS);
}