要回答第一个问题,0x80000000(-2,147,483,648)表示有符号整数的最小32位值.2,147,483,647是最大值.使用Two's Complement存储时,最大值的大小比最小值的大小小1 .服用(-y)单独因为它超过了最大值(由1)不能被表示.最后的整数值(x-y)在范围内(给定x为负)并且可以由32位整数表示.
要回答第二个问题,通过将要减去的数转换为其加法逆来实现减法.鉴于在这种情况下可能出现溢出,您的编译器可以(x-y)通过执行获得正确的结果-((-x)+y).然而,这是纯粹的推测(这是我能想到的唯一安全方法).