In MIPS Instruction set, why do we sign extend the immediate data instead of zero extend in I type instructions?
You have a limited number of bits in a 32-bit instruction word to create a 32-bit immediate value. If you can't create it this was, you will have to use multiple instructions or other tricks (slower, take more memory). So let's say you have 10 bits. What would be more usefull, being able to create


0 .. 1023, or
-512 .. 511 ? 


You can decide from intuition, or from data gathered from compiler back-ends, but in most cases people have concluded that including at least -1 is more usefull than doubling the range on the positive side.

IIRC ARM decided to use a slightly more complex scheme, using a few of the available bits to specify how much places the value must be shifted to the left. This sacrfices the number of small values that can be made, but gains a few (widely separate) larger values, which is nice for instance for bit fields within a word. But it requires barrel shifter hardware. The MIPS designers thought the transistors needed for a barrel shifter would be better used for other purposes.

The very good aspect of the H &amp; P books is that they quantify the effects of such design decisions. Do read all their books, not just this one.