防止数据类型变量产生回绕与溢出

产生以上大部分问题的原因主要是:
1.不同数据类型的算术操作,产生了回绕与溢出。
2.不同数据类型的逻辑运算操作,产生了回绕与溢出。
3.存储的数据大小超过了数据类型的最大值或最小值,产生了溢出和回绕。

一、显示地指出某个变量是signed char类型还是unsigned char来执行算数运算

由于不同编译器对char类型的变量定义不同,有可能是signed char,也有可能是unsigned char,所以,只有我们显示地指定数据类型,才能得到唯一的结果。

二、使用size_t类型表示一个对象所占用空间的整数值单位(内存大小)

size_t的引入增强了程序在不同平台上的可移植性,可以作为大小、索引、循环计数和长度的整数值。但是,在进行循环索引的时候,要注意size_t的大小

int i;
size_t n;
for(i=0;i<n;i++)
{//循环体
}

在上述代码中,定义了一个整形变量i,一个size_t变量n,一般size_t变量的数据范围会比int类型大(>INT_MAX),那么i在循环时,有可能会超出INT_MAX,而产生回绕。这里就出现了一个BUG。避免这种BUG的方法就是统一 i 和 n 的数据类型大小,即 i 的范围要大于 n的范围。

三、禁止把size_t类型和它所代表的真实类型混用

因为不同的平台对size_t的定义不同,若与其所代表的真实类型混用可能会在其它的平台报错。但size_t在每个平台都作为大小、索引、循环计数和长度的整数值,都是一个范围很大的数。

四、小心使用无符号类型带来的陷阱
当有符号整型和无符号整型进行算术运算时,有符号整型会自动转化为无符号整型,若此时有符号整型数值超过无符号整型的最大值或小于无符号整型的最小值时,转换就会出现问题,这里就会产生BUG。

五、防止无符号整数回绕
涉及无符号操作数的计算永远不会产生溢出
如果数值超过无符号整型的限定长度时就会发生回绕,即如果无符号整型变量的值超过了无符号整型的上限,就会返回0,然后又从0开始增大。

六、防止有符号整数溢出
当两个数都是有符号整数时,就有可能产生整数溢出,它将会导致“不能确定的行为”。也就是说整数溢出是一种未定义的行为,会随机出现各种各样的错误,出现的错误主要由编译器决定。

C语言--数据溢出导致的缓冲区(堆栈)损坏相关推荐

  1. 平方之后居然出现负数。数据溢出导致各种离奇运算结果

    实数的平方不可能为负值,只有复数的平方才可能出现负数( i 2 = − 1 i^2 = -1 i2=−1). 但是,在程序世界,数据溢出会导致实数的平方出现复制.数据溢出会导致各种离奇的计算结果. C ...

  2. c语言 数据溢出时会输出什么

    目录 文章目录 前言 一.整型数据常见的存储空间和值的范围 二.数据转换规则 原理 三.数据类型的应用 1.char -128~127 2.int类型(以4字节为例) 3.unsigned int(4 ...

  3. python读取文件数据堆栈溢出的原因_堆栈溢出一般是什么原因?

    堆栈是一个在计算机科学中经常使用的抽象数据类型.堆栈中的物体具有一个特性: 最后一个放入堆栈中的物体总是被最先拿出来, 这个特性通常称为后进先出(LIFO)队列. 堆栈中定义了一些操作. 两个最重要的 ...

  4. c语言变量名必须用小写 常量用大写,day02 -C语言 常量 变量 数据类型 进制转换 数据溢出...

    常量 - 不会变化的数据 "hello" 'A' 10 3.14 #define PI 3.14 //采用宏定义的方法 定义一个常量 const int a = 10; 求圆的面积 ...

  5. C语言之字符串探究(六):sprintf——把格式化的数据写入某个字符缓冲区

    相关博文:C++之char和string字符串类探究 相关博文:C语言之数组探究(一):定义.大小.初始化.访问和三要素 相关博文:C语言之字符串探究(一):字符串与字符数组 相关博文:C语言之字符串 ...

  6. c语言字节溢出,C语言变量定义与数据溢出(初学者)

    1.变量定义的一般形式为:类型说明符.变量名标识符等:例:int a,b,c;(abc为整型变量) 在书写变量定义时应注意以下几点: (1)允许在一个类型说明符后,定义多个相同类型的变量.各变量之间用 ...

  7. 【C语言】Pillow(数据溢出问题)

    nxx床上有n个抱枕,而他的床长为x, 宽为y, 假设这n个抱枕均为长方体,给出每个抱枕的长宽高,抱枕可以以任意一个面为底摆放.摆放完所有抱枕后,问nxx床上最多还剩多少面积的地方能让他睡觉 .数据保 ...

  8. python堆栈溢出的原因_堆栈溢出一般是什么原因

    堆栈是一个在计算机科学中经常使用的抽象数据类型.堆栈中的物体具有一个特性: 最后一个放入堆栈中的物体总是被最先拿出来, 这个特性通常称为后进先出(LIFO)队列. 堆栈中定义了一些操作. 两个最重要的 ...

  9. java编程数据溢出问题_Java数据溢出代码详解

    Java数据溢出代码详解 发布时间:2020-10-05 15:08:31 来源:脚本之家 阅读:103 作者:Pony小马 java是一门相对安全的语言,那么数据溢出时它是如何处理的呢? 看一段代码 ...

最新文章

  1. 自定义android控件EditText 自定义边框 背景
  2. ORA-00600[kjpsod1]ORA-44203错误一例
  3. Android开发之WebView加载html数据去除Webview滚动条的方法
  4. 计算机和自动化结合的专业,自动化转计算机?你可以选择这个专业!
  5. 牛逼!只需 3 步,Java 也能做图片识别!
  6. vb6.0连接access数据库
  7. 【CRM】开源CRM
  8. 贝叶斯分析好坏_浅析贝叶斯定理及其应用
  9. 计算机网络的最大优点,什么是计算机网络最突出的优点
  10. 肇庆学院计算机选修旷课,化学化工学院考查课管理办法(试行)
  11. juniper防火墙基于路由的IPsec ***配置
  12. hao123站长李兴平的成功史
  13. ios android与wp,在iOS与Android间选择WP
  14. Pikachu靶场:XSS盲打
  15. 手绘与码绘的比较---模拟风吹树动
  16. drill apache_Apache Spark与Apache Drill
  17. thinkpad x12018换固态_终极之后是否还有究极?ThinkPad X1 Carbon 2018评测
  18. 关于浏览器的几个问题
  19. win10下如何查看自己的显卡型号
  20. NetSniper网络尖兵:宽带网络运营维护管理器

热门文章

  1. APISpace 让你快速获取名言警句
  2. 位运算 之(1) 按位与(AND) 操作【转载】
  3. ​互联网的厕所,兵家的必争之地
  4. CFile用法与实现
  5. 抗混叠滤波器及其使用
  6. SLUB和SLAB的区别
  7. Windows远程桌面出现CredSSP加密数据修正问题解决方案
  8. handlebars学习总结
  9. 为什么有些应用程序愿意采用不可靠的UDP,而不愿意采用可靠的TCP?试解释为什么ARP高速缓存每存入一个项目就要设置10~20分钟的超时计时器。这个时间设置的太大或太小会出现什么问题?
  10. Pytorch框架之one_hot编码函数