【C语言笔记】整数溢出

前言

整数溢出是一种未定义的行为,当产生溢出行为时,系统并不会通知用户,所以应当多加小心。如下是整数溢出的一个案例:

SMT爆出的美图BEC代币出现的安全漏洞—整数溢出,该漏洞代理的直接经济损失高达上亿元人民币,间接产生的负面影响目前无法估量。

什么是整数溢出?

计算机语言中整数类型都有一个取值范围,两个整数进行运算时,若其结果大于最大值(上溢)或者小于最小值(下溢)就是溢出

假如最大值为a,在最大值和最小值之间如果发生以下计算:

a+1=0或0-1=a

此时就会发生溢出,其中a+1=0会发生上溢,0-1=a会发生下溢。

程序实例

示例(在32bit环境中编译)

// 整数溢出例子
#include <stdio.h>

int main(void)
{
 short i = 32767;
 unsigned short j = 65535;
 unsigned short k = 0;
 // 上溢例子
 printf("%hd %hd %hd\n", i, i+1, i+2);  
 // 上溢例子
 printf("%hu %hu %hu\n", j, j+1, j+2); 
 // 下溢例子
 printf("%hu %hu %hu\n", k, k-1, k-2); 
 return 0;
}

程序运行结果为:

在32bit环境中,short(占两个字节)的范围为

-32768~32767

unsigned short的范围为

0~65535

所以short类型的i=32767加1、加2时会产生上溢。unsigned short类型的j=65535加1、加2时会产生上溢。unsigned short类型的k=0减1、减2时会产生下溢。

(ps:可以使用程序来查看整数数据类型的范围,具体可移步至【C语言笔记】如何查看数据类型范围?进行查看)

以上就是关于整数溢出的笔记分享,如有错误欢迎指出!

(0)

相关推荐

  • C语言编程中的8位、16位、32位整数的分解与合并

    在单片机的编程中对于8位.16位.32位整数的分解与合并用的比较多,今天做了简要学习,后面还需要加以总结. 练习在VC++6.0编程环境中进行,源程序: #include <stdio.h> ...

  • 嵌入式编程中的高低位交换如何实现?

    最近的协议中遇到字节高低位转换的问题,于是偷懒上网查看,遇到类似的问题,也认识一个新的名字,叫做蝶式交换 问题是这样子的 协议要求字节低位在左,高位在右,对每个字节做转换处理,逐个交换其高低位,例如1 ...

  • 定点数和浮点数

    在选择计算机的数据表示方式时,通常需要考虑4点因素:要表示的数据类型(整数,小数,实数和复数)数值范围精确度数据存储和处理所需要的硬件代价计算机处理的数据多带有小数点,小数点在计算机中可以有两种方法表 ...

  • C语言笔记-双向链表和循环链表

    两种链表的增删改查操纵类似于单向链表. 双向链表: 一种更复杂的链表是"双向链表"或"双面链表".每个节点有两个连接:一个指向前一个节点,(当此"连接 ...

  • 辛苦整理的C语言笔记,还好没放弃

    c语言入门 C语言一经出现就以其功能丰富.表达能力强.灵活方便.应用面广等特点迅速在全世界普及和推广.C语言不但执行效率高而且可移植性好,可以用来开发应用软件.驱动.操作系统等.C语言也是其它众多高级 ...

  • 【C语言笔记】时间日期函数

    常持正念方圆梦,不忘初心总是春. /********前言********/ time.h是C/C++中的日期和时间头文件.用于需要时间方面的函数.下面分享time.h头文件中几个常用函数的用法: /* ...

  • 【C语言笔记】关于随机数的总结

    C语言的库头文件stdlib.h中有个生成随机数的函数: int rand(void); 该函数返回0~RAND_MAX之间的随机数,在stdlib.h中可知道,RAND_MAX为0x7FFF,如: ...

  • 【C语言笔记】变参函数

    提到变参函数,我们的感觉是不是既熟悉又陌生 ?感觉熟悉是因为我们平时都在使用着,如我们常使用的printf()函数与scanf()函数就是典型的变参函数.因为printf()函数是变参函数我们才可以根 ...

  • 【C语言笔记】ASCII码可见字符与不可见字符

    ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧 ...

  • 【C语言笔记】什么是ANSI C标准?

    我们在很多地方都有看到过K&R C.ANSI C.ISO C.C89.C99.C11等标准,具体有什么不同呢?(文末有个很好的实例) 什么是K&R C? 1978年,丹尼斯·里奇(De ...

  • 【C语言笔记】如何查看数据类型范围?

    知识点一:查看整数范围 当前的编译环境下,你可能不知道int的数据范围是多少,或者记不清无符号短整型的范围是0~65535还是0~65536?这时候就可以按照如下程序进行输出查看: #include ...

  • 【C语言笔记】分享一个C语言测试程序模板

    前言 平时需要测试一些比较模糊的知识点,或则想要验证一些函数时,我们常常会建一个test.c文件,然后在这个文件里写我们的测试代码,测试完毕后常常会删掉该文件.下次再遇到同样的问题的时候,可能又是记不 ...