And just to make it clear, nonce is a 32-bit unsigned integers, thus they are always non-negative (0 or positive) so the range is from 0 to 4,294,967,295.
As opposed to a 32-bit signed integers, that can be both positive or negative, hence -2,147,483,648 through 2,147,483,647.
since nonce has no meaning then how you interpret it makes no difference. it is simply 32 zeros and ones (aka bits) and goes from 000....000 to 000...001 and up to 111...111. keep in mind that there is no difference between Int32 and UInt32 when you look at them in binary.
And if it reached the maximum, the miner should change "something" in the coinbase transaction (like a random character in "mined by ###" that they're adding);
the correct way of saying it is that miner has to change something in "block header", that thing can be the extra nonce in coinbase transaction to change merkle root, or it could be the transactions in the block (change order, add/remove,...), it could be block time or block version. this last one is why we see weird block versions sometimes.