溢出处理及负数表示

由于计算机硬件的限制,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。

为何要使用补码

0%