@end tex
to
@ifnottex
-2**61 - 1)
+2**29 - 1),
@end ifnottex
@tex
-@math{2^{61}-1})
+@math{2^{29}-1}),
@end tex
- but some machines may provide a wider range. Many examples in this
- chapter assume an integer has 30 bits.
-but some older machines provide only 30 bits. Many examples in this
-chapter assume that an integer has 62 bits and that floating point
++but some machines provide a wider range. Many examples in this
++chapter assume that an integer has 30 bits and that floating point
+ numbers are IEEE double precision.
@cindex overflow
The Lisp reader reads an integer as a sequence of digits with optional
bitwise operators (@pxref{Bitwise Operations}), it is often helpful to
view the numbers in their binary form.
- In 62-bit binary, the decimal integer 5 looks like this:
+ In 30-bit binary, the decimal integer 5 looks like this:
@example
- 00 0000 0000 0000 0000 0000 0000 0101
-0000...000101 (62 bits total)
++0000...000101 (30 bits total)
@end example
- (We have inserted spaces between groups of 4 bits, and two spaces
- between groups of 8 bits, to make the binary integer easier to read.)
+@noindent
++(The @samp{...} stands for enough bits to fill out a 30-bit word; in
++this case, @samp{...} stands for twenty 0 bits. Later examples also
++use the @samp{...} notation to make binary integers easier to read.)
+
The integer @minus{}1 looks like this:
@example
- 11 1111 1111 1111 1111 1111 1111 1111
-1111...111111 (62 bits total)
++1111...111111 (30 bits total)
@end example
@noindent
@minus{}5 looks like this:
@example
- 11 1111 1111 1111 1111 1111 1111 1011
-1111...111011 (62 bits total)
++1111...111011 (30 bits total)
@end example
- In this implementation, the largest 62-bit binary integer value is
-2,305,843,009,213,693,951 in decimal. In binary, it looks like this:
+ In this implementation, the largest 30-bit binary integer value is
+536,870,911 in decimal. In binary, it looks like this:
@example
- 01 1111 1111 1111 1111 1111 1111 1111
-0111...111111 (62 bits total)
++0111...111111 (30 bits total)
@end example
Since the arithmetic functions do not check whether integers go
-outside their range, when you add 1 to 2,305,843,009,213,693,951, the value is the
-negative integer @minus{}2,305,843,009,213,693,952:
+outside their range, when you add 1 to 536,870,911, the value is the
+negative integer @minus{}536,870,912:
@example
-(+ 1 2305843009213693951)
- @result{} -2305843009213693952
- @result{} 1000...000000 (62 bits total)
+(+ 1 536870911)
+ @result{} -536870912
- @result{} 10 0000 0000 0000 0000 0000 0000 0000
++ @result{} 1000...000000 (30 bits total)
@end example
Many of the functions described in this chapter accept markers for
if any argument is floating.
It is important to note that in Emacs Lisp, arithmetic functions
- do not check for overflow. Thus @code{(1+ 268435455)} may evaluate to
- @minus{}268435456, depending on your hardware.
-do not check for overflow. Thus @code{(1+ 2305843009213693951)} may
-evaluate to @minus{}2305843009213693952, depending on your hardware.
++do not check for overflow. Thus @code{(1+ 536870911)} may evaluate to
++@minus{}536870912, depending on your hardware.
@defun 1+ number-or-marker
This function returns @var{number-or-marker} plus 1.
The function @code{lsh}, like all Emacs Lisp arithmetic functions, does
not check for overflow, so shifting left can discard significant bits
and change the sign of the number. For example, left shifting
- 536,870,911 produces @minus{}2 on a 30-bit machine:
-2,305,843,009,213,693,951 produces @minus{}2 on a typical machine:
++536,870,911 produces @minus{}2 in the 30-bit implementation:
@example
-(lsh 2305843009213693951 1) ; @r{left shift}
+(lsh 536870911 1) ; @r{left shift}
@result{} -2
@end example
- In binary, in the 30-bit implementation, the argument looks like this:
-In binary, in the 62-bit implementation, the argument looks like this:
++In binary, the argument looks like this:
@example
@group
-;; @r{Decimal 2,305,843,009,213,693,951}
-0111...111111 (62 bits total)
+;; @r{Decimal 536,870,911}
- 01 1111 1111 1111 1111 1111 1111 1111
++0111...111111 (30 bits total)
@end group
@end example
@example
@group
;; @r{Decimal @minus{}2}
- 11 1111 1111 1111 1111 1111 1111 1110
-1111...111110 (62 bits total)
++1111...111110 (30 bits total)
@end group
@end example
@end defun
@group
(ash -6 -1) @result{} -3
;; @r{Decimal @minus{}6 becomes decimal @minus{}3.}
- 11 1111 1111 1111 1111 1111 1111 1010
-1111...111010 (62 bits total)
++1111...111010 (30 bits total)
@result{}
- 11 1111 1111 1111 1111 1111 1111 1101
-1111...111101 (62 bits total)
++1111...111101 (30 bits total)
@end group
@end example
@example
@group
-(lsh -6 -1) @result{} 2305843009213693949
-;; @r{Decimal @minus{}6 becomes decimal 2,305,843,009,213,693,949.}
-1111...111010 (62 bits total)
+(lsh -6 -1) @result{} 536870909
+;; @r{Decimal @minus{}6 becomes decimal 536,870,909.}
- 11 1111 1111 1111 1111 1111 1111 1010
++1111...111010 (30 bits total)
@result{}
- 01 1111 1111 1111 1111 1111 1111 1101
-0111...111101 (62 bits total)
++0111...111101 (30 bits total)
@end group
@end example
@c with smallbook but not with regular book! --rjc 16mar92
@smallexample
@group
- ; @r{ 30-bit binary values}
- ; @r{ 62-bit binary values}
++ ; @r{ 30-bit binary values}
- (lsh 5 2) ; 5 = @r{00 0000 0000 0000 0000 0000 0000 0101}
- @result{} 20 ; = @r{00 0000 0000 0000 0000 0000 0001 0100}
+ (lsh 5 2) ; 5 = @r{0000...000101}
+ @result{} 20 ; = @r{0000...010100}
@end group
@group
(ash 5 2)
@result{} 1
@end group
@group
- (lsh -5 -2) ; -5 = @r{11 1111 1111 1111 1111 1111 1111 1011}
- @result{} 268435454 ; = @r{00 0111 1111 1111 1111 1111 1111 1110}
+ (lsh -5 -2) ; -5 = @r{1111...111011}
- @result{} 1152921504606846974
++ @result{} 268435454
+ ; = @r{0011...111110}
@end group
@group
- (ash -5 -2) ; -5 = @r{11 1111 1111 1111 1111 1111 1111 1011}
- @result{} -2 ; = @r{11 1111 1111 1111 1111 1111 1111 1110}
+ (ash -5 -2) ; -5 = @r{1111...111011}
+ @result{} -2 ; = @r{1111...111110}
@end group
@end smallexample
@end defun
@smallexample
@group
- ; @r{ 30-bit binary values}
- ; @r{ 62-bit binary values}
++ ; @r{ 30-bit binary values}
- (logand 14 13) ; 14 = @r{00 0000 0000 0000 0000 0000 0000 1110}
- ; 13 = @r{00 0000 0000 0000 0000 0000 0000 1101}
- @result{} 12 ; 12 = @r{00 0000 0000 0000 0000 0000 0000 1100}
+ (logand 14 13) ; 14 = @r{0000...001110}
+ ; 13 = @r{0000...001101}
+ @result{} 12 ; 12 = @r{0000...001100}
@end group
@group
@smallexample
@group
- ; @r{ 30-bit binary values}
- ; @r{ 62-bit binary values}
++ ; @r{ 30-bit binary values}
- (logior 12 5) ; 12 = @r{00 0000 0000 0000 0000 0000 0000 1100}
- ; 5 = @r{00 0000 0000 0000 0000 0000 0000 0101}
- @result{} 13 ; 13 = @r{00 0000 0000 0000 0000 0000 0000 1101}
+ (logior 12 5) ; 12 = @r{0000...001100}
+ ; 5 = @r{0000...000101}
+ @result{} 13 ; 13 = @r{0000...001101}
@end group
@group
@smallexample
@group
- ; @r{ 30-bit binary values}
- ; @r{ 62-bit binary values}
++ ; @r{ 30-bit binary values}
- (logxor 12 5) ; 12 = @r{00 0000 0000 0000 0000 0000 0000 1100}
- ; 5 = @r{00 0000 0000 0000 0000 0000 0000 0101}
- @result{} 9 ; 9 = @r{00 0000 0000 0000 0000 0000 0000 1001}
+ (logxor 12 5) ; 12 = @r{0000...001100}
+ ; 5 = @r{0000...000101}
+ @result{} 9 ; 9 = @r{0000...001001}
@end group
@group
@example
(lognot 5)
@result{} -6
- ;; 5 = @r{00 0000 0000 0000 0000 0000 0000 0101}
-;; 5 = @r{0000...000101} (62 bits total)
++;; 5 = @r{0000...000101} (30 bits total)
;; @r{becomes}
- ;; -6 = @r{11 1111 1111 1111 1111 1111 1111 1010}
-;; -6 = @r{1111...111010} (62 bits total)
++;; -6 = @r{1111...111010} (30 bits total)
@end example
@end defun