Is noInterrupts(); needed with a volatile variable?

If you're touching a volatile variable bigger than a byte, you will certainly need to turn interrupts off. This is because getting the two bytes of your int is not an atomic operation, so you may get one byte loaded and have the interrupt change the value before you get the second, giving you garbage.

I'm not comfortable saying that a single byte operation would be bulletproof either, but this is because I just don't know - it may be.

To minimize the time interrupts are off, just copy the volatile variable to another variable in the critical section. Work with the copied one afterwards.

If an interrupt occurs while interrupts are off, it's queued. If it's more than one, you've missed some.