https://medium.com/@csdiaries/understanding-integer-overflow-in-computer-science-and-programming-505aefc1453a