Sign Extension
Wiki Index
- A negative int that’s sign extended is padded with ones not zeroes.
- Java sign extends when casting from int to long; this is especially significant because Java doesn’t have unsigned ints, so an int with a high first bit is considered negative. Specifically, this can be a problem when twiddling bits directly:
;; First bit is used to denote the sign, so the max value is (2^31)-1 instead of (2^32)-1
> (Integer/MAX_VALUE)
2147483647
;; and the min value is -(2^31).
> (Integer/MIN_VALUE)
-2147483648
> (Long/toBinaryString (Integer/MAX_VALUE))
"1111111111111111111111111111111"
> (Long/toBinaryString (Integer/MIN_VALUE))
"1111111111111111111111111111111110000000000000000000000000000000"
;; `2r` denotes a Clojure binary literal
> (long 2r1111111111111111111111111111111)
2147483647
;; This is incorrectly interpreted as a positive number
> (long 2r1111111111111111111111111111111110000000000000000000000000000000)
Execution error (IllegalArgumentException) at /eval13060 (form-init2730003737097781770.clj:229).
Value out of range for long: 18446744071562067968