当前位置:网站首页>C陷阱与缺陷 第3章 语义“陷阱” 3.9 整数溢出
C陷阱与缺陷 第3章 语义“陷阱” 3.9 整数溢出
2022-07-29 02:48:00 【weixin_客子光阴】
整数溢出
C语言中存在两类整数算术运算:有符号运算与无符号运算。在无符号算术运算中,没有所谓的“溢出”一说:所有无符号运算都是以2的n次方为模,这里n是结果中的位数。如果算术运算符的一个操作数是有符号整数,另一个是无符号整数,那么有符号整数会被转换成无符号整数,“溢出”也不可能发生。
但是,当两个操作数都是有符号整数时,“溢出”就有可能发生,而且“溢出”的结果是未定义的。当一个运算的结果发生“溢出”时,做出任何假设都是不安全的。
假定a和b是两个非负整型变量,我们需要检查a+b是否会“溢出”。一种想当然的方式是这样:
//a >= 0, b >= 0
if (a + b < 0) {
complain();
}
这并不能正常运行。当a+b确实发生“溢出”时,所有关于结果如何的假设都不在可靠。例如,在某些机器上,加法运算将设置一个内部寄存器为4中状态之一:正、负、零和溢出。在这种机器上,a与b相加的结果为溢出,而不是为负,所以if语句的检查就会失败。
一种正确的方式是将a和b都强制转换为无符号整数:
if ((unsigned)a + (unsigned)b > INT_MAX) {
complain();
}
此处的INT_MAX是一个已定义常量,代表可能的最大整数值。ANSI C标准在<limits.h>中定义了INT_MAX;如果是在其他C语言实现中,读者也许需要自己重新定义。
不需要用到无符号算术运算的另一种可行方式是:
if (a > INT_MAX - b) {
complain();
}
边栏推荐
- 从零开始实现lmax-Disruptor队列(六)Disruptor 解决伪共享、消费者优雅停止实现原理解析
- Interpretation of ue4.25 slate source code
- K210 - sound source location and sound recognition
- 会议OA项目之我的审批功能
- OWT server source code analysis (4) -- video module analysis of mixer out
- Add a row to a specific location in the dataframe
- Etcd implementation of large-scale service governance application practice
- RestfulAPI——C#——增加header用户名密码验证
- vasp计算任务报错:M_divide:can not subdivide 8 nodes by 6
- 数仓中概念术语解析
猜你喜欢

A good-looking IAPP donation list source code

idea配置web容器与war打包

Flink kernel source code (VII) Flink SQL submission process

【FreeSwitch开发实践】UniMRCP编译与安装

centos安装mysql8

C language: hollow square pattern

解析机器人与人类情感共鸣的主观意识

第09章_性能分析工具的使用

New UI Sifang aggregate payment system source code / new usdt withdrawal / latest update security upgrade to fix XSS vulnerability patch vulnerability

百度副总裁李硕:数字技术加持下中国劳动力成本上升是好事
随机推荐
PHP lucky draw system with background source code
HTB-Blue
Notes on the ninth day
Notes on the sixth day
MongoDB索引 (3)
R language error: compilation failed for package '****‘
明明开发薪资高,为什么我还是选了测试?
QT compilation of IOT management platform 48 characteristic function design
C language: Little Lele and hexadecimal conversion
Unable to start after idea installation
混淆矩阵学习笔记
A good-looking IAPP donation list source code
Groupby method
idea配置web容器与war打包
扫雷简单版
【npm错误】- npm ERR code ERESOLVE 和 npm ERR ERESOLVE could not resolve 问题
看机器人教育引领素质教育主流
Analysis of OWT server source code (III) -- video module analysis of mixer in
Zone --- line segment tree lazy marking board sub problem
The origin of Nacos' name