c语言之——整型的隐式转换与溢出检测
溢出检测
我们可以通过下面的方式来检测溢出:
if(a > INT_MAX - b)
{
printf("overflow\n");
}
我们利用整型的最大值减去其中一个数,然后与另一个数进行比较。其中INT_MAX定义在limit.h头文件中,它表示整数的最大值。
当然,我们还可以通过下面的方式来检测:
if((unsigned int)a + (unsigned int)b > INT_MAX)
{
printf("overflow\n");
}
将两个数都先转换成无符号数进行计算,运算后的结果与INT_MAX进行比较。
尽量避免
虽然我们有方法来检测溢出,但是我们建议的是尽量去避免溢出的发生。可以通过下面的方式来避免:
选择合适的数据类型,当数据较大可能会超出short int的范围时,就不该选择short int,而应该选择int等所表示范围更大的类型。
在设计上尽量回避溢出。例如,要计算两个整数的平均值,我们想到的方法可能是(a+b)/2,但是这样却有溢出的风险,我们可以换一种方式:a-(a-b)/2,这种方式就回避了溢出的问题。
当然对于不可避免的可能发生溢出的情况,我们需要进行检测并进行后处理,而非忽略。
总结
对于整型隐式转换和溢出相关内容,我们做一个总结:
避免有符号数和无符号数直接进行算术运算。
一个很小的负数被转换成有符号数时,将会变得很大。因此一个无符号数和一个有符号负数的比较结果几乎是显而易见的。
溢出的结果是未定义的,不要期望对它做任何假设。
尽量避免溢出问题。
java中没有无符号数。
c语言之——整型的隐式转换与溢出检测的更多相关文章
- 【校招面试 之 C/C++】第18题 C++ 中的隐式转换以及explicit关键字
1.什么是隐式转换: 众所周知,C++的基本类型中并非完全的对立,部分数据类型之间是可以进行隐式转换的. 所谓隐式转换,是指不需要用户干预,编译器私下进行的类型转换行为.很多时候用户可能都不知道进行了 ...
- Scala入门到精通——第十九节 隐式转换与隐式參数(二)
作者:摇摆少年梦 配套视频地址:http://www.xuetuwuyou.com/course/12 本节主要内容 隐式參数中的隐式转换 函数中隐式參数使用概要 隐式转换问题梳理 1. 隐式參数中的 ...
- 记录: 一次解决整型溢出攻击(使用scala,隐式转换)
最近项目遇到一次整型溢出攻击 有一个功能,玩家购买num个物品. 每个物品花费14货币. 客户端限制玩家只能购买 1-9999个该物品. 但是某玩家通过技术手段,获得了客户端的运行权限. 于是发送协议 ...
- C++ 语言中的重载、内联、缺省参数、隐式转换等机制展现了很多优点
C++ 语言中的重载.内联.缺省参数.隐式转换等机制展现了很多优点,但是这些 优点的背后都隐藏着一些隐患.正如人们的饮食,少食和暴食都不可取,应当恰到好处. 我们要辨证地看待 C++的新机制,应该恰如 ...
- 一个 MySQL 隐式转换的坑,差点把服务器整崩溃了
我是风筝,公众号「古时的风筝」,专注于 Java技术 及周边生态. 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在里面. 本来是一个平静而美好的下午,其 ...
- C++语言编译系统提供的内部数据类型的自动隐式转换
C++语言编译系统提供的内部数据类型的自动隐式转换规则如下: 程序在执行算术运算时,低类型自动隐式转换为高类型. 在函数调用时,将实参值赋给形参,系统隐式的将实参转换为形参的类型,并赋值给形参. 函数 ...
- C语言的整型溢出问题
整型溢出有点老生常谈了,bla, bla, bla… 但似乎没有引起多少人的重视.整型溢出会有可能导致缓冲区溢出,缓冲区溢出会导致各种黑客攻击,比如最近OpenSSL的heartbleed事件,就是一 ...
- 【java】学习路线1-类型转换、隐式转换、强制转换
/**文档注释,这里是一段文章一般放在类的外面*/public class HelloWorld{ //这个是注释的文本 public static void main(String[] ...
- JavaScript学习笔记——数据类型强制转换和隐式转换
javascript数据类型强制转换 一.转换为数值类型 Number(参数) 把任何的类型转换为数值类型 A.如果是布尔值,false为0,true为1 B.如果是数字,转换成为本身.将无意义的后导 ...
随机推荐
- 软件素材---C/C++格式化显示当前时间--标准函数strftime
函数原型:size_t strftime (char* ptr, size_t maxsize, const char* format,const struct tm* timeptr ); 头文件: ...
- matlab中执行mex文件时提示GLIBCXX not found
解决方案参考: http://stackoverflow.com/questions/8421708/glibcxx-not-found-when-compiling-vtk-example-unde ...
- LeetCode 102. 二叉树的层次遍历(Binary Tree Level Order Traversal) 8
102. 二叉树的层次遍历 102. Binary Tree Level Order Traversal 题目描述 给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 每 ...
- Python-17-反射
一.什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被 ...
- Django出错Xadmin后台报list index out of range
input_html = [ht for ht in super(AdminSplitDateTime, self).render(name, value, attrs).split('/>&l ...
- 20 闭包、nonlocal
闭包的概念 闭包就是能够读取其他函数内部变量的函数. 从模块级别调用函数内部的局部变量. 闭包 = 函数+环境变量(函数外部的变量) 闭包存在的条件 闭包必须返回一个函数 被返回的函数必须调用环境变量 ...
- 音视频入门-05-RGB-TO-BMP使用开源库
* 音视频入门文章目录 * RGB-TO-BMP 回顾 将 RGB 数据转成 BMP 图片: 了解 BMP 文件格式 准备 BMP 文件头信息 准备 BMP 信息头 BMP 存储 RGB 的顺序是 B ...
- Redis—.Net中的使用
StackExchange.Redis使用以及封装 来源:http://www.cnblogs.com/qtqq/p/5951201.html,https://www.cnblogs.com/xsj1 ...
- VBA用户自定义函数(十五)
函数是一组可重复使用的代码,可以在程序中的任何地方调用.这消除了一遍又一遍地编写相同的代码的需要.这使程序员能够将一个大程序划分成许多小的可管理的功能模块. 除了内置函数外,VBA还允许编写用户定义的 ...
- idea中异常处理快捷键
键盘按下 alt+Enter 一般选择try/catch这一个