当前位置: 首页 > news >正文

农民工学CSAPP题目解析-前篇题目解答以及答疑总结

博主昵称:一拳必胜客
博主主页面链接:博主主页传送门
博主专栏页面连接:专栏传送门--计算机考研
创作初心:本博客的初心是每天分享记录自己学习的脚步,和各位技术友探讨交流;
博主研究方向:渗透测试、嵌入式、机器学习;
博主寄语:感谢各位技术友的支持,您的支持就是我前进的动力 ;

 特别鸣谢:木芯工作室

孔子学鼓琴师襄子,十日不进。师襄子曰:“可以益矣。”孔子曰:“丘已习其曲矣,未得其数也。”有间,曰:“已习其数,可以益矣。”孔子曰:“丘未得其志也。”有间,曰:“已习其志,可以益矣。”孔子曰:“丘未得其为人也。”有间,有所穆然深思焉,有所怡然高望而远志焉。曰:“丘得其为人,黯然而黑,几然而长,眼如望羊,如王四国,非文王其谁能为此也!”师襄子辟席再拜,曰:“师盖云文王操也。”


目录

一、信息的表示和处理

1. 掩码运算

2. c语言移位运算

3. 整形数据类型

4. size_t 计数

5. 重要的数字表示:UMax-无符号数最大值 TMin-补码最小值

6. 带格式打印

7.CSAPP 练习题 2.25 -- 关于无符号数 -1 的不曾预料到的意外结果

8. XDR库中的安全漏洞

9. 浮点数带来的问题


一、信息的表示和处理

1. 掩码运算

x&0xFF 就是与上很多1,来挑选位

为了可移植性,我们得到0x1111全一都用~0x0取反操作

2. c语言移位运算

一般:

有符号数 无符号数
算数移动-右移补符号位逻辑移动-补0

x 》》 4(算数右移)

0110 0110 ------- 1111 0110

3. 整形数据类型

 

速查表:

char -128 ~ +127 (1 Byte)
short -32767 ~ + 32768 (2 Bytes)
unsigned short 0 ~ 65536 (2 Bytes)
int -2147483648 ~ +2147483647 (4 Bytes)
unsigned int 0 ~ 4294967295 (4 Bytes)
long == int
long long -9223372036854775808 ~ +9223372036854775807 (8 Bytes)
double 1.7 * 10^308 (8 Bytes)

unsigned int 0~4294967295 
long long的最大值:9223372036854775807
long long的最小值:-9223372036854775808
unsigned long long的最大值:1844674407370955161

__int64的最大值:9223372036854775807
__int64的最小值:-9223372036854775808
unsigned __int64的最大值:18446744073709551615

 

/* There is some amount of overlap with <sys/types.h> as known by inet code */
#ifndef __int8_t_defined
# define __int8_t_defined
typedef signed char                int8_t;
typedef short int                int16_t;
typedef int                        int32_t;
# if __WORDSIZE == 64
typedef long int                int64_t;
# else
__extension__
typedef long long int                int64_t;
# endif
#endif

4. size_t 计数

size_t主要用于计数,他就是一个unsinged int的重定义. 如sizeof函数返回值类型即为size_t。在不同位的机器中所占的位数也不同,size_t是无符号数。

 

 size_t x;

5. 重要的数字表示:UMax-无符号数最大值 TMin-补码最小值

int32_t a = 12;
printf("%d", a );
system("pause");

6. 带格式打印

 http://eleaction01.spaces.eepw.com.cn/articles/article/item/245365

7.CSAPP 练习题 2.25 -- 关于无符号数 -1 的不曾预料到的意外结果

#include <stdio.h>
 
float sum_elements(float a[], unsigned length);
int main(int argc, const char *argv[])
{
	float a[] = {1.0,2.0,3.3,4.3,5.6,6.1,7.8,8.5,9.0,10.1};
	sum_elements(a, 0);
	return 0;
}
float sum_elements(float a[], unsigned length){
 
	int i;
	float result = 0;
	for(i=0; i<= length-1; i++)
		result +=a[i];
	return result;
}

这里 i< length -1 , 因为length是无符号数,所以 当length = 0 , 0-1 = -1 , -1 的无符号数表示 是0xFFFFFFFFF,所以,i会一直增值往 这个最大的无符号数奔去……

测试结果:内存访问越界

--很容易发生访问其他不让访问地区的漏洞

8. XDR库中的安全漏洞

 

9. 浮点数带来的问题

浮点运算的不精确性能够产生灾难性的后果。1991年2月25日,在第 一次海湾战争期间,沙特阿拉伯的达摩地区设置的美国爱国者导弹,拦截伊拉克的飞 毛腿导弹失败。飞毛腿导弹击中了美国的一个兵营,造成28名士兵死亡。美国总审 .计局(GAO)对失败原因做了详细的分析[76],并且确定底层的原因在于一个数字计 _算不精确。在这个练习中,你将重现总审计局分析的一部分。 爱国者导弹系统中含有一个内置的时钟,其实现类似一个计数器,每0.1秒就加1。为了以秒为单位来确定时间,程序将用一个24位的近似于1/10的二进制小数值 来乘以这个计数器的值。特别地,1/10的二进制表达式是一个无穷序列0. 000110011 [0011]…2,其中,方括号里的部分是无限重复的。程序用值x来近似地表示0. 1,x只考虑这个序列的二进制小数点右边的前23位:x = 0. 00011001100110011001100。

A. 0.1-x的二进制表示是什么?

B. 0.1-x的近似的十进制值是多少?

C. 当系统初始启动时,时钟从0开始,并且一直保持计数。在这个例子中,系统已经运行了大约100个小时。程序计算出的时间和实际的时间之差为多少?

D. 系统根据一枚来袭导弹的速率和它最后被雷达侦测到的时间,来预测它将在哪里出现。假定飞毛腿的速率大约是2000米每秒,对它的预测偏差了多少?


通过一次读取时钟得到的绝对时间中的轻微错误,通常不会影响跟踪的计算。相反,它应该依赖于两次连续的读取之间的相对时间。问题是爱国者导弹的软件已经升级,可以使用更精确的函数来读取时间,但不是所有的函数调用都用新的代码替换了。结果就是,跟踪软件一次读取用的是精确的时间,而另一次读取用的是不精确的时间。

解答:
在大多数情况中,浮点数的有限精度不是主要的问题,因为计算的相对误差仍然是相当低的。然而在这个例子中,系统对于绝对误差是很敏感的。

A. 我们可以看到0.1-x的二进制表示为:

0.000000000000000000000001100[1100]…2

B. 把这个表示与1/10的二进制表示进行比较,我们可以看到这就是2-20X(1/10),也就是大约9.54X10-8。

C. 9. 54X10'8 X100X60X60X10约等于0. 343秒。

D.0. 343X2000约等于687米。
 

相关文章:

  • HBase系列从入门到精通(二)
  • libusb系列-002-Windows下libusb源码编译
  • 【C++ 科学计算】C++ 矩阵操作运算符
  • 全排列笔记
  • Python环境变量与引包错误
  • Mysql内置函数整理--基础类型函数
  • 万字爽文一篇带你掌握Java8新特性
  • Node.js的Web后端开发调研
  • Spring、MySQL、日期、BigDecimal、集合、反射、序列化中的坑与使用指南
  • DC 交换机 buffer 的平方反比律
  • 编程神器Copilot逐字抄袭他人代码?
  • 【数据结构】初始集合框架
  • “今天星期五“-SAP SE09/STMS 请求号传输中遇到的错误及解决方案
  • @Bean, @Component, @Configuration简析
  • 2022 年InfoWorld 精选最佳开源软件
  • 【css3】浏览器内核及其兼容性
  • const let
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • javascript 总结(常用工具类的封装)
  • js 实现textarea输入字数提示
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • vue自定义指令实现v-tap插件
  • 程序员最讨厌的9句话,你可有补充?
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 入手阿里云新服务器的部署NODE
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • #1014 : Trie树
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • $forceUpdate()函数
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (轉貼) UML中文FAQ (OO) (UML)
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .net core控制台应用程序初识
  • .net mvc 获取url中controller和action
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .NET使用存储过程实现对数据库的增删改查
  • .vue文件怎么使用_我在项目中是这样配置Vue的
  • @31省区市高考时间表来了,祝考试成功
  • @GlobalLock注解作用与原理解析
  • [ IOS ] iOS-控制器View的创建和生命周期
  • [ NOI 2001 ] 食物链
  • [.net 面向对象程序设计进阶] (19) 异步(Asynchronous) 使用异步创建快速响应和可伸缩性的应用程序...
  • [Android开源]EasySharedPreferences:优雅的进行SharedPreferences数据存储操作
  • [BJDCTF2020]The mystery of ip
  • [BZOJ]4817: [Sdoi2017]树点涂色