注:本篇文章是对《深入理解操作系统》这本书的笔记。
无符号运算:

以一个四位数字表示,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语言数据类型重新认识相关推荐

  1. c语言定义字符类型变量的关键字,C语言数据类型

    C语言关键字: 也称保留字,是C语言预先定义的.具有特殊意义的单词. 数据类型关键字(12个): (1)char:声明字符型变量或函数 (2)double:声明双精度变量或函数 (3)enum:声明枚 ...

  2. C语言数据类型所占空间大小

    C语言数据类型所占空间大小 /* * datasize.c -- print the size of common data items * This runs with any Linux kern ...

  3. R语言数据类型:Logical、Numeric、Integer、Complex、Character、Vectors、Lists、Matrices、Arrays、Factors、DataFrames

    R语言数据类型:Logical.Numeric.Integer.Complex.Character.Vectors.Lists.Matrices.Arrays.Factors.DataFrames 通 ...

  4. R语言数据类型及数据类型判断

    R语言数据类型及数据类型判断 目录 R语言数据类型及数据类型判断 从存储角度看R数据类型

  5. C语言数据类型大学霸IT达人

    C语言数据类型大学霸IT达人 在人们的生活中会处理大量的数据,在处理数据之前我们会对数据进行分类.如一年有356天,12个月.在处理天和月的数据中会使用到整数.在超市的找零时我们会使用到以元为单位的小 ...

  6. 嵌入式c语言为什么变量定义在前面,嵌入式C语言数据类型和变量详解

    原标题:嵌入式C语言数据类型和变量详解 一般来讲,标准的C语言类型在嵌入式编译器中是合法的.但由于嵌入式控制器的受限环境.嵌入式c语言的变量和数据类型具有新的特征,这些特征体现在如下方面. 嵌入式C语 ...

  7. 声明对象_计算机各语言数据类型及对象声明之区别

    各语言数据类型 JS中数据类型有:整数型.浮点型.String.布尔型.转义字符.未定义.空值(null) JAVA中数据类型有: byte short int long float double b ...

  8. C语言数据类型本质分析

    C语言数据类型本质分析 数据类型概念 数据类型的本质思考 数据类型的本质 数据类型大小 数据类型别名 数据类型的封装 数据类型总结与扩展 思考1 思考2 数据类型概念 "类型"是 ...

  9. C语言数据类型 / 变量类型 - C语言零基础入门教程

    目录 一.C 语言数据类型分类 二.C 语言整形 1.无符号整形(16 位系统) 2.有符号整形(16 位系统) 3.int 和 long 区别 4.超出取值范围的整形 三.C 语言浮点型 float ...

  10. C语言定义直线的数据类型,C语言 | 数据类型

    原标题:C语言 | 数据类型 1.变量与常量数据 在程序的世界中,可以让计算机按照指令做很多事情,如进行数值计算.图像显示.语音对话.视频播放.天文计算.发送邮件.游戏绘图以及任何我们可以想象到的事情 ...

最新文章

  1. 一段语音生成说话视频,连发际线都可以分好几种,网友:利好视频博主
  2. 5 秒创建 k8s 集群[转]
  3. php动态+trait,详解PHP神奇又有用的Trait
  4. PHP 循环引用的问题
  5. MySQL基础篇(03):系统和自定义函数总结,触发器使用详解
  6. DataNode之DirectoryScanner分析
  7. “写代码三年月薪不到一万是不是很失败?”
  8. disruptor小结1--优势
  9. python画50个图-Matplotlib如何绘制多个子图
  10. 空间复杂度怎么算_西餐厅主题餐饮空间设计装修预算怎么算?-雨川
  11. P4213 【模板】杜教筛(杜教筛)题解
  12. 刀片存储助力发挥融合基础架构优势
  13. 小石坝第一次月赛:A
  14. 2.(echarts篇)echarts颜色地图边缘高亮
  15. Elasticsearch检索分类深入详解—基础篇
  16. python求组合数c(m、n)编程题_c语言编程问题,计算出从n 个不同元素中取出m 个元素(m≤n)的组合数。编写程序...
  17. 微信小程序支付PHP实例
  18. 巴特沃夫 c语言,全相位滤波器在人工耳蜗CIS方案中的应用
  19. android tensorflow文字识别身份证识别ocr文字识别商用源码
  20. Java项目:ssh在线招投标系统

热门文章

  1. Fence Repair-栅栏维修(优先队列)
  2. 一个研究生导师的肺腑直言
  3. 游戏开发人员需要看的书籍
  4. 第二个c程序,日语208音练习
  5. 如何测试支付宝的转账功能
  6. Spring Cloud Gateway实战之三:动态路由
  7. Vue 自适应高度表格的实现方法
  8. ssh_dispatch_run_fatal: Connection to 10.119.126.248 port 29418: incorrect signature fatal: Could no
  9. 数字图像处理大作业实验报告
  10. AVFormatContext、AV_read_frame、av_seek_frame