Answer from cs61c-au (Robert Webb 14343043) for Question 3 A few years ago I was assigned to write a compression utility in C that simply compressed or decompredded a text file using the fact that a-z and A-Z and all the other important ASCII characters were below 127. This means that the most significant bit can be ignored. I used the shift >> operator and I got quite a few bugs in the code which I did not understand. The professor told me to use unsigned char variables instead of char (which presumably are signed by default). The bugs went away! I now understand that what was hapening was that the C compiler, when shifting to the right, filled in the gaps with whatever the most significant bit was, not a 0. This is because if you shift to the right, the result should give you the original binary value divided by two. (or divided by 2 then + or - 1/2 because of remainder issues...) If a negative signed int is shifted right by 1 the result must be negative, because a negative number devided by two is negative. Therefore, the most significant bit must remain 1. If the complier had simply filled in the empty space with 0, the result would have been positive. With unsigned numbers, the >> operator simply fills the left-most bit with a 0. This is why unsigned integers were needed. It had been bothering me for some time why the signed integers needed to have the significant bit filled with the same value as the previous significant bit, and now I know. THANKS!