由于计算机硬件的限制,C++中具体类型的表示范围是有限制的,所以可能会在运算中出现溢出的情况,特别是在涉及负数运算的情况下,本文将对C++中溢出及负数等相关知识进行总结。
常见类型范围
int类型
int类型范围是-2147483648~2147483647,表示为科学计数法为$-2^{31}$到$2^{31}-1$,在C++中,int的边界为宏定义INT_MIN与INT_MAX,特别注意INT_MIN不能取负值,否则会越界。所以在需要对一个负数进行取反之前,首先要判断是否大于INT_MIN,如果等于INT_MIN,那么取反的结果为INT_MAX
(dividend == INT_MIN ? INT_MAX : -dividend);
long long类型
long long范围是$-2^{63}$到$2^{63}-1$,两个int类型相乘是可以保证不会越过long long的类型范围的。
数的表示
在计算机中,正数与负数均使用补码进行表示,有符号类型的最高位代表符号位。
正数的表示
正数原码、反码与补码均相同,考虑8位的char类型,正数二进制表示范围是0000,0000-0111,1111,即$0$到$2^7-1$。
负数的表示
负数的补码可以表示为该数绝对值的原码的反码+1,以-127为例
- 127原码为0111,1111
- 127反码为1000,0000
- 127的反码加1: 1000,0001
故-127补码为1000,0001
那么问题来了,-128如何表示呢,这里直接规定-128的补码就是1000,0000,所以负数的表示范围为1000,0000到1111,1111,即从-128到-1。