C语言数据类型重新认识
以一个四位数字表示,x=9,y=12;分别是1001 和1100,它们的和是21,相加后5位表示为10101,但是如果丢弃最高位,我们就得到了0101也就是十进制的5,他就和21mod15的值一样了。是否溢出是看和的最高位w+1是否被置1,如果等于0,和原来4位一样丢弃也没有影响。如果溢出相当于从和减去16.
int uadd_ok(unsigned char x,unsigned chary){unsigned char s=x+y;printf("%d ",s);printf("%d",s>=x) ;}
对于一个w位的数判断是否溢出的方法,
设s=x+y;
0<=x<=2^w-1;
0<=y<2^w-1;
所以0<=s<=2^(w+1)-2;
我们要判断s是否等于x+y,因为如果正常s=x+y>=x,如果s确实溢出了,s=x+y-2^w,假设y<2^w,我们就有y-2^w<0,因此s=x+(y-2^w)<x.,即s<x或者s<y的时候就可以了.
补码加法:
给定:-2^w-1<=x,y<=2^w-1之内 整数值,他们的和就在范围-2^w<=x+y<=2^w-2之内。要准确表示可能需要w+1位,我们通表示截断到w位,来避免数据大小的扩张,然而结果却不像模数加法那样熟悉。
还是以4位数的为例子。
一共有四种情况:
x y x+y 截断后结果 情况
-8[1000] -5[1011] -13[10011] 3[0011] 1
-8[1000] -8[1000] -16[10000] 0[0000] 1
-8[1000] 5[0101] -3[11101] -3[1101] 2
2[0010] 5[0101] 7[00111] 7[0111] 3
5[0101] 5[0101] 10[01010] -6[1010] 4
当w=4的补码加法,运算数的范围是-8~7,当x+y<-8的时候,补码加法会负溢出,导致和增加了16,当-8 <x+y<8的时候,加法就产生x+y。当x+y>=8的时候,会正溢出,使得结果减少了16。
判断是否溢出,无符号整数。
//有符号型判断。int tadd_ok(char x,char y){ //这是答案 答案的数据类型为整形。char sum=x+y;intneg_over=x<0&&y<0&&sum>0=0;intpos_over=x>=0 && y>=0 && sum<0;return!neg_over && !pos_over; }int tadd_ok_2(char x,char y){//答案说这个不行,我试了下可以的,答案的类型是整形 //阿贝尔群知识不懂char sum=x+y;return (sum-x==y)&&(sum-y==x);}void inplace(int *x,int*y)//交换两个变量的值,不用临时变量{*y=*x^*y;*x=*x^*y;*y=*x^*y;}//不可自己交换自己否则得0void reverse_array(int a[],int cnt){intfirst,last;for(first=0,last=cnt-1;first<=last;first++,last--){voidinplace(&a[first],&a[last]);}}/*上面这个函数包含元素个数为偶数个的时候可以,奇数不可以,奇数时候最后一次交换中间值本身,inplace函数中运算会的到0,所以把first<=last改成first<last.*///检验乘法是否溢出int tmult_ok(int x,int y){intp=x*y;return!x || p/x==y;}
//在int tadd_ok_2(char x,char y)不成立的前提下无法理解用除法判断乘法溢出,并且无法看懂解释:
1:说明x和y的乘积x*y可以写成x*y=p+t*2^w;,其中t不等于0,当且仅当p的计算溢出。
2.说明p可以写成这样形式:p=x*q+r|r|<|x|;
3.说明q=y当且仅当r=t=0;
//这个函数对于数据类型为int 的32位情况,使用64位精度数据类型long long 而不使用除法。int tmult_ok_2(int x,int y){longlong pll =(long long )x*y;returnpll==(int)pll;}
乘法溢出漏洞案例:
Sun Microsystems公司的XDR。
代码
void *copy_elements(void *ele_src[],intele_cnt,size_t ele_size){void *result=malloc(ele_cnt *ele_size);if(result==NULL)return NULL;void *next=result;int i;for(i=0;i<ele_cnt;i++){memcpy(next,ele_src[i],ele_size);next+=ele_size;}return result;}
函数copy_elements的设计上将ele_cnt个数据结构复制到申请得到的数据缓冲区内,每个函数结构包含了ele_size个字节,需要的字节是通过ele_cnt*ele_size得到的。
如果怀有恶意的人把参数ele_cnt等于1048577(2^20+1)ele_size等于(2^12)4096,来调用这个函数,然后乘法上会溢出,导致只分配4096个字节而不是装下这些数据所需要的
4294971392个字节,从循环开始的会试图复制所有字节,超越已经分配的缓冲区的界限,因而破坏了其他的数据结构,导致程序崩溃或者行为异常。
修复代码:
long long unsignedrequired_size=ele_cnt*(long long unsigned)ele_size;size_t request_size=(size_t)required_size;if(request_size!=required_size)return NULL;
修复代码的后面三句至关重要,删除后没有作用,malloc调用的时候会把longlong unsigned 当成一个32位的无符号数。还是溢出。
C语言数据类型重新认识相关推荐
- c语言定义字符类型变量的关键字,C语言数据类型
C语言关键字: 也称保留字,是C语言预先定义的.具有特殊意义的单词. 数据类型关键字(12个): (1)char:声明字符型变量或函数 (2)double:声明双精度变量或函数 (3)enum:声明枚 ...
- C语言数据类型所占空间大小
C语言数据类型所占空间大小 /* * datasize.c -- print the size of common data items * This runs with any Linux kern ...
- R语言数据类型:Logical、Numeric、Integer、Complex、Character、Vectors、Lists、Matrices、Arrays、Factors、DataFrames
R语言数据类型:Logical.Numeric.Integer.Complex.Character.Vectors.Lists.Matrices.Arrays.Factors.DataFrames 通 ...
- R语言数据类型及数据类型判断
R语言数据类型及数据类型判断 目录 R语言数据类型及数据类型判断 从存储角度看R数据类型
- C语言数据类型大学霸IT达人
C语言数据类型大学霸IT达人 在人们的生活中会处理大量的数据,在处理数据之前我们会对数据进行分类.如一年有356天,12个月.在处理天和月的数据中会使用到整数.在超市的找零时我们会使用到以元为单位的小 ...
- 嵌入式c语言为什么变量定义在前面,嵌入式C语言数据类型和变量详解
原标题:嵌入式C语言数据类型和变量详解 一般来讲,标准的C语言类型在嵌入式编译器中是合法的.但由于嵌入式控制器的受限环境.嵌入式c语言的变量和数据类型具有新的特征,这些特征体现在如下方面. 嵌入式C语 ...
- 声明对象_计算机各语言数据类型及对象声明之区别
各语言数据类型 JS中数据类型有:整数型.浮点型.String.布尔型.转义字符.未定义.空值(null) JAVA中数据类型有: byte short int long float double b ...
- C语言数据类型本质分析
C语言数据类型本质分析 数据类型概念 数据类型的本质思考 数据类型的本质 数据类型大小 数据类型别名 数据类型的封装 数据类型总结与扩展 思考1 思考2 数据类型概念 "类型"是 ...
- C语言数据类型 / 变量类型 - C语言零基础入门教程
目录 一.C 语言数据类型分类 二.C 语言整形 1.无符号整形(16 位系统) 2.有符号整形(16 位系统) 3.int 和 long 区别 4.超出取值范围的整形 三.C 语言浮点型 float ...
- C语言定义直线的数据类型,C语言 | 数据类型
原标题:C语言 | 数据类型 1.变量与常量数据 在程序的世界中,可以让计算机按照指令做很多事情,如进行数值计算.图像显示.语音对话.视频播放.天文计算.发送邮件.游戏绘图以及任何我们可以想象到的事情 ...
最新文章
- 一段语音生成说话视频,连发际线都可以分好几种,网友:利好视频博主
- 5 秒创建 k8s 集群[转]
- php动态+trait,详解PHP神奇又有用的Trait
- PHP 循环引用的问题
- MySQL基础篇(03):系统和自定义函数总结,触发器使用详解
- DataNode之DirectoryScanner分析
- “写代码三年月薪不到一万是不是很失败?”
- disruptor小结1--优势
- python画50个图-Matplotlib如何绘制多个子图
- 空间复杂度怎么算_西餐厅主题餐饮空间设计装修预算怎么算?-雨川
- P4213 【模板】杜教筛(杜教筛)题解
- 刀片存储助力发挥融合基础架构优势
- 小石坝第一次月赛:A
- 2.(echarts篇)echarts颜色地图边缘高亮
- Elasticsearch检索分类深入详解—基础篇
- python求组合数c(m、n)编程题_c语言编程问题,计算出从n 个不同元素中取出m 个元素(m≤n)的组合数。编写程序...
- 微信小程序支付PHP实例
- 巴特沃夫 c语言,全相位滤波器在人工耳蜗CIS方案中的应用
- android tensorflow文字识别身份证识别ocr文字识别商用源码
- Java项目:ssh在线招投标系统
热门文章
- Fence Repair-栅栏维修(优先队列)
- 一个研究生导师的肺腑直言
- 游戏开发人员需要看的书籍
- 第二个c程序,日语208音练习
- 如何测试支付宝的转账功能
- Spring Cloud Gateway实战之三:动态路由
- Vue 自适应高度表格的实现方法
- ssh_dispatch_run_fatal: Connection to 10.119.126.248 port 29418: incorrect signature fatal: Could no
- 数字图像处理大作业实验报告
- AVFormatContext、AV_read_frame、av_seek_frame