无聊写写
溢出
每一种数据类型都有数值范围,如果存放的数值超出了这个范围(小于最小值或大于最大值),需要更多的二进制位存储,就会发生溢出。大于最大值,叫做向上溢出(overflow);小于最小值,叫做向下溢出(underflow)。
unsigned char x = 255;
x = x + 1;
printf("%d\n", x); // 0
unsigned int ui = UINT_MAX; // 4,294,967,295
ui++;
printf("ui = %u\n", ui); // 0
ui--;
printf("ui = %u\n", ui); // 4,294,967,295
上面示例中,常量UINT_MAX
是 unsigned int 类型的最大值。如果加1
,对于该类型就会溢出,从而得到0
;而0
是该类型的最小值,再减1
,又会得到UINT_MAX
。
溢出很容易被忽视,编译器又不会报错,所以必须非常小心。
for (unsigned int i = n; i >= 0; --i) // 错误
最小值是0,你TMD还去减 不错玩个毛啊? 答案是会一直死循环 一直为0
为了避免溢出,最好方法就是将运算结果与类型的极限值进行比较。
unsigned int ui;
unsigned int sum;
// 错误
if (sum + ui > UINT_MAX) too_big();
else sum = sum + ui;
// 正确
if (ui > UINT_MAX - sum) too_big();
else sum = sum + ui;
上面示例中,变量sum
和ui
都是 unsigned int 类型,它们相加的和还是 unsigned int 类型,这就有可能发生溢出。但是,不能通过相加的和是否超出了最大值UINT_MAX
,来判断是否发生了溢出,因为sum + ui
总是返回溢出后的结果,不可能大于UINT_MAX
。正确的比较方法是,判断UINT_MAX - sum
与ui
之间的大小关系。
声明:以上文章不是原创,但有修改。GITHUB浏览获得。
标签:MAX,sum,unsigned,C语言,ui,UINT,溢出 From: https://www.cnblogs.com/bi-hu/p/16581968.html