/* shift.c
* Demonstrates the different effects of right and left shifting
* in combination with signed and unsigned “8-bit” data.
*/
#include
int main() {
unsigned char x = 0x19;
// shifts are bitwise operators,
// so data type doesn’t matter until you interpret the data
unsigned char L1 = x<<2;
unsigned char L2 = x<<3;
unsigned char L3 = x<<4;
printf("\n");
/* Note: printf statements can be hard to work with to view
small data. The %d, %u, and %x specifiers extend
to 32 bits and %c displays characters instead of
values.
*/
printf("** Left Shift (<<) **\n");
// %.2X prints at least 2 capital hex digits (padding with 0),
// using capital hex digits.
printf("* Hex: x = 0x%.2X, L1 = 0x%.2X, L2 = 0x%.2X, L3 = 0x%.2X\n",
x, L1, L2, L3);
// cast to signed char to get sign extension
// %4 just means to pad to 4 characters in length
printf("* Signed: x = %4d, L1 = %4d, L2 = %4d, L3 = %4d\n",
(char)x, (char)L1, (char)L2, (char)L3);
printf("* Unsigned: x = %4u, L1 = %4u, L2 = %4u, L3 = %4u\n",
x, L1, L2, L3);
printf("*********************\n\n");
unsigned char xu = 0xF0;
char xs = 0xF0;
unsigned char R1u = xu>>3;
char R1s = xs>>3;
unsigned char R2u = xu>>5;
char R2s = xs>>5;
printf(“** Right Shift (>>) **\n”);
printf(“* Logical: xu = 0x%.2X = %4u\n”, xu, xu);
printf(“* R1u = 0x%.2X = %4u\n”, R1u, R1u);
printf(“* R2u = 0x%.2X = %4u\n”, R2u, R2u);
// cast to unsigned char to avoid sign extension for hex
printf(“* Arithmetic: xs = 0x%.2X = %4d\n”, (unsigned char)xs, xs);
printf(“* R1s = 0x%.2X = %4d\n”, (unsigned char)R1s, R1s);
printf(“* R2s = 0x%.2X = %4d\n”, (unsigned char)R2s, R2s);
printf(“**********************\n\n”);
// main function in C supposed to return an int
// (used to signal to OS)
return 0;
}