For what follows to make sense you will need to understand the key Day key concepts
If we deal with months then we have a problem
What are the answers to the following (remembering 2008 is a leap year) :
(a) 1st January 2008 plus 1 month? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1st Feb
(b) 21st January 2008 plus 1 month? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21st Feb
(c) 30th January 2008 plus 1 month? . . . . . . . . . . . . . . . . . . . . . . . . 29th Feb or 1st March
(d) 31st January 2008 plus 1 month? . . . . . . . . . . . . . . . . . . . . . . . . 29th Feb or 2nd March
(e) 28th January 2009 plus 1 month? . . . . . . . . . . . . . . . . . . . . . . . . . 28th Feb or 25th Feb
(f) 29th January 2009 plus 1 month? . . . . . . . . . . . . . . . 28th Feb or 1st March or 26th Feb
(g) 30th January 2009 plus 1 month? . . . . . . . . . . . . . . 28th Feb or 2nd March or 27th Feb
(h) 31st January 2009 plus 1 month? . . . . . . . . . . . . . . . . . . . . . . . . 28th Feb or 3rd March
(i) 29th February 2008 plus 1 year? . . . . . . . . . . . . . . . . . . . . . 28th Feb or 1st March 2009
Are we all agreed with (a)? It is pretty reasonable that one month after the first of any month will be the first of the next month. And so for the 2nd, 3rd and so on... What about the last day of the month? Shouldn't a one month addition map to the last day of the next month? By this reasoning (d) and (h) should give the last day of February. (Different because 2008 is a leap year.) What about the 2nd and 3rd from last days? Shouldn't these map to the 2nd and 3rd from last days of the next month? (f) is 2 days before the end of January so surely the result should be two days before the end of February?
The moral of the story is if your project is delayed by a 'month', get that changed to 28 days or 4 weeks.
Cal attempts to convert to the equivilent Julian day number and if it succeeds then adds the required number of days then converts back. This fails though if the date isn't fully specified and returns NV.
INT and FLO use the DAYSINMONTH constant (30.4375) to convert the date to days which are then added as you'd expect then converted back