C语言之整形溢出

c语言中存在两种整形算术运算,有符号运算与无符号运算。在无符号算数运算中,没有所谓的“溢出”一说:所有的无符号运算都是以2的n次方为模,这里的n是结果中的位数。如果算数运算符的一个操作数是有符号整数,另一个是无符号整数,那么有符号整数会被转换为无符号整数,”溢出“也不可能发生。但是,当两个操作数都是有符号的整数时,”溢出“就有可能发生,而且”溢出的结果是未定义的。当一个运算的结果发生”溢出“是,做出任何假设都是不安全的。

例如,假定a和b是两个非负整形变量,我们需要检查a+b是否会”溢出“。一种想当然的方式是这样:

if(a+b<0)

complain();

这并不能正常运行。当a+b确实发生”溢出“时,所有关于结果如何的假设都不再可靠。例如,在某些机器上,加法运算将设置一个内部寄存器为四种状态之一:正、负、零、和溢出。在这种机器上,c编译器完全有理由来实现上面的例子,即a与b相加,然后检查该内部寄存器的标志是否为”负“。当加法操作发生”溢出“时,这个内部寄存器的状态是溢出而不是负,那么if的语句的检查就会失败。

一种正确的方式是将a和b都强制转换为无符号整数:

if((unsigned)a+(unsigned)b>INT_MAX)

complain();

时间: 2024-10-11 15:46:11

C语言之整形溢出的相关文章

C语言的整形提升

1.算术转换 许多运算符都会引发转换,以类似的方式产生结果类型,这个模式称为“寻常算术转换”. 首先,任何类型为char或short的操作数被转换为int,任何类型为float的操作数被转换为double.其次,如果其中一个操作数类型为double,那么另一个操作数被转换为double,计算结果类型也是double.再次,如果其中一个操作数类型为long,那么另一个操作数被转换为long,计算结果类型也为long.或者,其中一个操作数的类型数unsigned,那么另一个操作数被转换为unsign

关于leetcode中整形溢出的几道题。

题一:String to Integer (atoi) 主要是要注意这里的输入输出的特列: 题目的要求是:1 1. 前面的空格可以忽略: 2. 第一个非空格要么是整数,要么是'+','-';如过不是这些就返回0: 3. 要考虑整型溢出的情况. 大致就是这么三点 /*------------------------------------atoi -----------------------------------*/ /*LeetCode Accept 需要的测试用例: +1 1 -1 214

C语言的整型溢出问题(转)

整型溢出有点老生常谈了,bla, bla, bla… 但似乎没有引起多少人的重视.整型溢出会有可能导致缓冲区溢出,缓冲区溢出会导致各种黑客攻击,比如最近OpenSSL的heartbleed事件,就是一个buffer overread的事件.在这里写下这篇文章,希望大家都了解一下整型溢出,编译器的行为,以及如何防范,以写出更安全的代码. 什么是整型溢出 C语言的整型问题相信大家并不陌生了.对于整型溢出,分为无符号整型溢出和有符号整型溢出. 对于unsigned整型溢出,C的规范是有定义的——“溢出

C语言学习之三

现在在公司做PHP开发,今天老大让我解决一个Linux下的curl问题,说实话,我解决不了.然后他还让我自己租一台服务器.我靠,我现在一个月才一千多块,除去房租就剩下可怜的几百款,这还没算吃饭,交通费.他说一个月就50 多块钱,我想说的是,如果老板给我开7.8K的话,我肯定会自己租一台服务器,但是我现在连基本的生活都有问题.对于他来说,50块只不是一包烟或几瓶水的钱.但对我来说,是我的十分之一的可用开支.最后还是他给我组了一台服务器.租完,今天我还要亲自搭建LAMP环境,我也是醉了,用了一个早上

C语言的基本概念

1.经典入门:hello world 1 #include <stdio.h> 2 3 int main(void) 4 { 5 printf("hello world.\n"); 6 7 return 0; 8 } 注:上面所使用的关键字:include 头文件包含 int 整型,用来表示整数的类型 void 空类型 return 函数返回 2.基本概念: 源文件:源文件即源程序代码文件,C语言源文件后缀名是.c: 头文件:头文件的后缀名为.h,C语言代码由源文件和头文件

[程序设计语言-摘记&amp;注解]-03:控制流

阅读导航 本系列其他文章目录请戳这里. 0.概述 1.表达式求值 1.1赋值(1)-引用和值 1.1赋值(2)-装箱和拆箱 1.1赋值(3)-多路赋值 1.2表达式里的顺序问题&数学的等值关系 1.3短路求值 2.结构化和非结构化的流程 2.1goto的机构化替代品 2.2继续(Continuations) 3.顺序复合(Sequencing) 4.选择 4.1短路条件 4.2case/switch语句 5.迭代 5.1枚举控制器的循环 5.2迭代器 5.3逻辑控制的循环 6.递归 6.1迭代和

PHP长整型在32位系统中强制转化溢出

CleverCode近期遇到一个PHP项目整形转化问题,mysql有一个字段id是bigint的,里面有长整型,如id = 5147486396.可是php代码因为历史原因却部署在多台机器中,当中A机器32位系统中,B机器64系统中.如今的问题是64系统中页面訪问正常.32位系统中訪问出错了.原因是php整形溢出. 1 A机器演示 1.1 获取A机器系统位数 # getconf LONG_BIT 1.2 整形转化代码 <? php $id = 5147486396; echo '$id:'.$i

使用OC语言编写两个超大数相乘或相加的算法的思路和超大正整数相乘的代码

正文: 在编程中,无论是OC还是C亦或是C++语言,所声明的整数变量都会在内存中占有固定的存储空间,而这些存储空间都是固定的. 比如我们知道的int.long.short.unsigend int.unsigend long.unsigend long long等等,都有固定的存储空间,而哪怕是64位系统下的变量unsigend long long,能存储的最大范围只有1844674407370955161. 下边复习一下基础类型的存储范围以及所占字节: 编程语言的基础类型速查表 char -1

CTF 两道web整数溢出题目(猫咪银行和ltshop)

①猫咪银行: (2018中科大hackgame) 一开始给十个CTB,而flag需要20个CTB,我们需要理财赚够20个. 理财是只能买入TDSU才可以获得收益.我们先上来直接把CTB全部换成TDSU. 上边是我们花了所有TDSU:66060买了19分钟后的收益.(因为一个账号最多存在20分钟,计算你用脚本极限也不能买20分钟,必须留一分钟用来换TDSU和买入,取出等操作) 还是不行,算上收益的钱1200231也不够买20个CTB. 考虑买RMX是否存在汇率差. 发现一个CTB57个RMX,一个