# Integer#odd?, Integer#even?, Integer#pred for 1.8

**URL:** <https://www.ruby-forum.com/t/integer-odd-integer-even-integer-pred-for-1-8/120388>\
**Category:** Development\
**Created:** [November 16, 2007, 1:11pm UTC](https://www.ruby-forum.com/t/integer-odd-integer-even-integer-pred-for-1-8/120388 "2007-11-16T13:11:06Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![Tanaka\_A](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@Tanaka\_A](https://www.ruby-forum.com/u/Tanaka_A)\
**Post date:** [November 16, 2007, 1:11pm UTC](https://www.ruby-forum.com/t/integer-odd-integer-even-integer-pred-for-1-8/120388/1 "2007-11-16T13:11:06Z")

</div>

e$B$U$He(B 1.9 e$B$Ne(B test\_integer.rb e$B$re(B 1.8  
e$B$GF0$+$=$&$H$7$?$i!"%a%=%Ce(B  
e$B%I$,B-$j$J$+$C$?$N$Ge(B Integer#odd?, Integer#even?,  
Integer#pred e$B$re(B backport  
e$B$7$F$7$^$C$?$s$G$9$,!"$I$&$G$9$+$M!#e(B

# Index: numeric.c

— numeric.c (e$B%j%S%8%g%se(B 13948)  
+++ numeric.c (e$B:n6H%3%T!\<e(B)  
@@ -1786,6 +1786,39 @@

/\*

- call-seq:

- 
  - 

```
int.odd? -> true or false

```

- 
  - 

- 
  - Returns `true` if _int_ is an odd number.

- \*/
- 

+static VALUE  
+int\_odd\_p(VALUE num)  
+{

- if (rb\_funcall(num, ‘%’, 1, INT2FIX(2)) != INT2FIX(0)) {
- 

```
   return Qtrue;

```

- }
- return Qfalse;  
+}
- 

+/\*

- 
  - call-seq:

- 
  - 

```
int.even? -> true or false

```

- 
  - 

- 
  - Returns `true` if _int_ is an even number.

- \*/
- 

+static VALUE  
+int\_even\_p(VALUE num)  
+{

- if (rb\_funcall(num, ‘%’, 1, INT2FIX(2)) == INT2FIX(0)) {
- 

```
   return Qtrue;

```

- }
- return Qfalse;  
+}
- 
- 

+/\*

- 
  - call-seq:
  - 

```
int.next => integer

```

  - 

```
int.succ => integer

```

  - 

@@ -1808,6 +1841,26 @@

/\*

- call-seq:

- 
  - 

```
int.pred => integer

```

- 
  - 

- 
  - Returns the `Integer` equal to _int_ - 1.

- 
  - 

- 
  - 

```
1.pred #=> 0

```

- 
  - 

```
(-1).pred #=> -2

```

- \*/
- 

+static VALUE  
+int\_pred(VALUE num)  
+{

- if (FIXNUM\_P(num)) {
- 

```
   long i = FIX2LONG(num) - 1;

```

- 

```
   return LONG2NUM(i);

```

- }
- return rb\_funcall(num, ‘-’, 1, INT2FIX(1));  
+}
- 

+/\*

- 
  - call-seq:
  - 

```
int.chr => string

```

  - 
  - Returns a string containing the ASCII character represented by the  
@@ -2262,15 +2315,6 @@  
return LONG2NUM(z);  
}

-static VALUE  
-int\_even\_p(VALUE num)  
-{

- if (rb\_funcall(num, ‘%’, 1, INT2FIX(2)) == INT2FIX(0)) {
- return Qtrue;
- }
- return Qfalse;  
-}
- 

/\*

- call-seq:
- fix \*\* other =\> Numeric  
@@ -2907,6 +2951,38 @@  
return Qfalse;  
}

+/\*

- 
  - call-seq:

- 
  - 

```
fix.odd? -> true or false

```

- 
  - 

- 
  - Returns `true` if _fix_ is an odd number.

- \*/
- 

+static VALUE  
+fix\_odd\_p(VALUE num)  
+{

- if (num & 2) {
- 

```
   return Qtrue;

```

- }
- return Qfalse;  
+}
- 

+/\*

- 
  - call-seq:

- 
  - 

```
fix.even? -> true or false

```

- 
  - 

- 
  - Returns `true` if _fix_ is an even number.

- \*/
- 

+static VALUE  
+fix\_even\_p(VALUE num)  
+{

- if (num & 2) {
- 

```
   return Qfalse;

```

- }
- return Qtrue;  
+}
- 

void  
Init\_Numeric()  
{  
@@ -2961,12 +3037,15 @@  
rb\_undef\_method(CLASS\_OF(rb\_cInteger), “new”);

```
 rb_define_method(rb_cInteger, "integer?", int_int_p, 0);

```

- rb\_define\_method(rb\_cInteger, “odd?”, int\_odd\_p, 0);

- rb\_define\_method(rb\_cInteger, “even?”, int\_even\_p, 0);  
rb\_define\_method(rb\_cInteger, “upto”, int\_upto, 1);  
rb\_define\_method(rb\_cInteger, “downto”, int\_downto, 1);  
rb\_define\_method(rb\_cInteger, “times”, int\_dotimes, 0);  
rb\_include\_module(rb\_cInteger, rb\_mPrecision);  
rb\_define\_method(rb\_cInteger, “succ”, int\_succ, 0);  
rb\_define\_method(rb\_cInteger, “next”, int\_succ, 0);

- rb\_define\_method(rb\_cInteger, “pred”, int\_pred, 0);  
rb\_define\_method(rb\_cInteger, “chr”, int\_chr, 0);  
rb\_define\_method(rb\_cInteger, “ord”, int\_ord, 0);  
rb\_define\_method(rb\_cInteger, “to\_i”, int\_to\_i, 0);  
@@ -3020,6 +3099,8 @@  
rb\_define\_method(rb\_cFixnum, “to\_f”, fix\_to\_f, 0);  
rb\_define\_method(rb\_cFixnum, “size”, fix\_size, 0);  
rb\_define\_method(rb\_cFixnum, “zero?”, fix\_zero\_p, 0);

- rb\_define\_method(rb\_cFixnum, “odd?”, fix\_odd\_p, 0);

- rb\_define\_method(rb\_cFixnum, “even?”, fix\_even\_p, 0);

---

<div class="post-metadata">

**Author:** ![Tanaka\_A](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@Tanaka\_A](https://www.ruby-forum.com/u/Tanaka_A)\
**Post date:** [November 16, 2007, 1:59pm UTC](https://www.ruby-forum.com/t/integer-odd-integer-even-integer-pred-for-1-8/120388/2 "2007-11-16T13:59:07Z")

</div>

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

In message “Re: [ruby-dev:32303] Integer#odd?, Integer#even?,  
Integer#pred for 1.8”  
on Fri, 16 Nov 2007 21:10:48 +0900, Tanaka A. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
writes:

|e$B$U$He(B 1.9 e$B$Ne(B test\_integer.rb e$B$re(B 1.8 e$B$GF0$+$=$&$H$7$?$i!“%a%=%Ce(B  
|e$B%I$,B-$j$J$+$C$?$N$Ge(B Integer#odd?, Integer#even?,  
|Integer#pred e$B$re(B backport e$B$7$F$7$^$C$?$s$G$9$,!”$I$&$G$9$+$M!#e(B

e$B$$$$$s$8$c$J$$$G$7$g$&$+!#e(B
