Хотя прошло уже два года, я чувствовал, что мог бы также добавить свою пенитворту для действительно быстрого способа обнаружения переполнения хотя бы для дополнений, которые могут дать преимущество для умножения, деления и степени
Идея состоит в том, что именно потому, что процессор просто позволит обернуть значение до нуля, а C / C ++ должен быть абстрагирован от любого конкретного процессора, вы можете:
uint32_t x, y;
uint32_t value = x + y;
bool overflow = value < (x | y);
Это гарантирует, что если один операнд равен нулю, а другой - нет, переполнение не будет обнаруживаться ложно и будет значительно быстрее, чем множество операций NOT / XOR / AND / test, как предлагалось ранее.
Редактировать :
Как уже указывалось, этот подход, хотя и лучше, чем другие, более сложные способы, все же можно оптимизировать. Ниже приведена редакция исходного кода, содержащего оптимизацию:
uint32_t x, y;
uint32_t value = x + y;
bool overflow = value < x; // Alternatively "value < y" should also work