What I discovered while looking into this same issue on a site is that the table q is a temporary table created during the delete process, so changing to an unsigned isn’t possible for this particular instance. It really isn’t the best solution anyway, but I think we realized that already.
The problem in my case is that there are quotes created in the sales_flat_quote table with an item_count of 0. During the product delete process, it attempts to reduce the item_count in the quote by 1.
My process of fixing this was to run a select statement on the sales_flat_quote table to find any records with item_count of 0. Then I exported these records and removed them from the DB. Once these records were removed, the delete completed properly. I put these records back in the database when I was done, which may not be needed, but I felt better having them there since they were there before.
I believe this is really an issue with the M2E plugin not properly putting data in the sales_flat_quote table, but this is pure speculation on my part, but so far in all the research I did on the subject, it appears that only sites running the M2E plugin were having this problem, and it may be fixed in later releases. The site I was working on was not up to date. Hope this helps someone.
I put up a more detailed description of what I found and how I fixed the issue on my client’s site on my blog at: http://hosting.fancyfiber.com/2013/02/01/sqlstate22003-numeric-value-out-of-range/