summaryrefslogtreecommitdiff
path: root/CSAPP/chap2/shifts.c
diff options
context:
space:
mode:
Diffstat (limited to 'CSAPP/chap2/shifts.c')
-rw-r--r--CSAPP/chap2/shifts.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/CSAPP/chap2/shifts.c b/CSAPP/chap2/shifts.c
new file mode 100644
index 0000000..836476d
--- /dev/null
+++ b/CSAPP/chap2/shifts.c
@@ -0,0 +1,39 @@
+/*
+ * Shift operations
+ *
+ * Right shifts might use either arithmetic shifts or logical shifts.
+ *
+ * This small piece of code should identify which one is used
+ */
+
+#include <stdio.h>
+
+int main(void)
+{
+ /* Using char so we care for a single byte only */
+ char x, a;
+ unsigned char y, b;
+ /* bin 10101001 */
+ a = b = 0xA9;
+
+ printf("Original signed variable: 0x%.2x\n", a);
+
+ /*
+ * Signed data variables are right shifted using Arithmetic shift. i.e.
+ * left bits are filled with a copy of the most significant bit of the
+ * original value
+ */
+ x = a >> 3;
+ printf("Signed right shift by 3: 0x%.2x\n\n", x);
+
+ printf("Original unsigned variable: 0x%.2x\n", b);
+ /*
+ * Unsigned data variables are right shifted logically. i.e. left bits
+ * are just filled with zeros
+ */
+ y = b >> 3;
+ printf("Unsigned right shift by 3: 0x%.2x\n", y);
+ return 0;
+}
+
+