-bytespersigop is parsed as int64, stored as unsigned int, and multiplied by a transaction's sigop cost into the int32 sizes used by the mempool. Negative values wrap, values of 2^32 or more are truncated (4294967296 turns the sigop adjustment off), and large values overflow, so a debug build aborts on an Assume. The first commit refuses any value outside [0, 21474] at startup: up to 21474, a package of 25 transactions at the standard sigops limit still has an int32 size.
The second commit checks the sigops limit before a transaction is staged. A transaction that is otherwise standard can be far over that limit, and at 21474 one with about 100,000 sigops still overflows when staged. mempool_sigoplimit.py covers the range, a 25-transaction package at 21474, and that transaction.