前言
这是在写一道关于需要处理整数溢出的运算的题时学到的概念,一般对于long long都承载不了的数我们一般用大整数都能解决,但是对于只是判断整数是否溢出时了解整数溢出的机制有时候能够事半功倍。
一、无符号整型溢出
对于unsigned整型溢出,C标准在这一方面是有定义的:“溢出后的数会以2^(8*sizeof(type))作模运算”,如果一个unsigned char溢出了,需要把溢出的值与256求模。
二、有符号整型溢出
对于signed整型的溢出,C的规范定义是“undefined behavior”,虽然没有定义,各编译器可自己实现,大部分的溢出机制还是一样的。
有符号整型溢出可以分为向上溢出和向下溢出。假设用k个字节表示一个整型变量, 那么这个变量可以表示的有符号整数的范围是-2^(8k-1) ~ 2^(8k-1) – 1,两个正整数或者两个负整数相加就有可能超过这个整型变量所能表示的范围, 向上超出>2^(8k-1) – 1称之为向上溢出, 向下超出<-2^(8k-1) 我们称之为向下溢出。
先说对于所有溢出情况的结论,当溢出时(以signed char举例),我们会取结果的低八位,并对其表示的符号位判断该数字的正负。
对于两数之和是否溢出的判断,这时候我们就可以得出:两个正数相加后溢出结果将 <0,两个负数相加后溢出结果将>=0。