I'm a little confused now by java left shift operation,
1<<31 = 0x80000000 --> this I can understand
But
1<<32 = 1 Why is this?
1<<33 = 2
Looks like more shifting values, modulus 32 of the value is taken.
Thanks everybody for the replying and giving the quote from JLS.
I just want to know more. Any idea of the reason why it's designed in this way? Or is it just some convention? Apparently C doesn't have this quirk?
Thanks to @paxdiablo. Looks like C declares this behaviour undefined.
I have some personal assumption here:
ARM architecture Reference Manual A7.1.38
Syntax
LSL Rd, Rm, #immed_5
where:
Rd Is the register that stores the result of the operation.
Rm Is the register containing the value to be shifted.
immed_5 Specifies the shift amount, in the range 0 to 31.
On instruction level, the immeidate immed_5 takes only 5 bits to avoid meaningless operations so as to save some instruction space. I guess high level languages just unitize this convention to avoid meaningless effort when compile to instructions.
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…