《深入理解计算机系统》实验一Data Lab 下载和官方文档机翻

前言

《深入理解计算机系统》官网:http://csapp.cs.cmu.edu/3e/labs.html
该篇文章是
实验一Data Lab的Writeup(datalab.pdf)机翻
原文:http://csapp.cs.cmu.edu/3e/datalab.pdf

在官网点击下方即可下载实验一的文件
在这里插入图片描述

1 介绍

此实验的目的是为了更熟悉整数和浮点数的位级表示。你可以通过解决一系列编程“难题”来做到这一点这些谜题中有很多都是人为的,但你会发现自己在解决它们的过程中会更多地考虑一些细节。

2 组织工作

这是一个个人项目。所有的管理都是电子的。澄清和更正将在课程网页上公布。

3 材料说明

特点地点:在这里插入一段解释讲师将如何向学生分发datalab-handout.tar文件。

首先将datalap -handout.tar复制到计划在其中执行工作的Linux机器上的一个(受保护的)目录。然后发出命令
在这里插入图片描述
这将导致在目录中解压大量文件。您需要修改和提交的唯一文件是bits.c。

bits.c文件包含13个编程难题中的每一个的框架。您的任务是只使用整数谜题的直线代码(即,没有循环或条件)和有限数量的C算术和逻辑运算符来完成每个函数框架。具体来说,您只能使用以下八个运算符
在这里插入图片描述
一些函数进一步限制了这个列表。此外,不允许使用任何长于8位的常量。请参阅bits.c中的注释,了解详细规则和所需编码风格的讨论。

4 谜题

本节描述您将在bits.c中解决的难题。

表1按难度顺序列出了这些谜题。“评级”字段给出了谜题的难度评级(点数),“最大操作”字段给出了你可以用于实现每个功能的最大操作数。请参阅bits.c中的注释,了解函数所需行为的更多细节。您还可以引用tests.c中的测试函数。这些函数被用作引用函数来表达函数的正确行为,尽管它们不满足函数的编码规则。

函数名说明评级最大操作
bitxor(x,y)实现x || y只使用&和~114
tmin()返回最小的二进制的补整数14
isTmax(x)只有当x是最大的二进制数是才为真110
allOddBits(x)仅当x中的所有奇数位都为1时为真212
negate(x)返回-x25
isAsciDigit(x)如果0x30<=x<=0x39返回1(ASCII码字符’0’到’9’)315
conditional(x,y,z)和x ? y : z一样316
isLessOrEqual(x,y)if x<= y return 1,else return 0324
logicalNeg(x)实现!操作符,使用所有合法的操作符,除了!412
howManyBits(x)返回在二进制的补码中表示x所需的最小位数490
floatScale2(uf)返回浮点型参数uf的表达式2*f的位级等效值。430
floatFloat2Int(uf)对于浮点型参数f,返回表达式(int) f的位级等效值。430
floatPower2(x)对于任意32位整数x,返回表达式2.0^x(2.0的x次方)的位级等价值。430
表1:数据实验室谜题。对于浮点数问题,值f是与无符号整数uf具有相同位表示的浮点数。

对于浮点谜题,您将实现一些常见的单精度浮点运算。对于这些谜题,您可以使用标准的控制结构(条件、循环),也可以使用int和unsigned数据类型,包括任意的unsigned和integer常量。不能使用任何联合、结构或数组。最重要的是,不能使用任何浮点数据类型、操作或常量。相反,任何浮点操作数都将作为无符号类型传递给函数,而任何返回的浮点值都将是无符号类型。代码应该执行实现指定浮点操作的位操作。

包含的程序fshow帮助您理解浮点数的结构。要编译fshow,请切换到讲义目录并输入:
在这里插入图片描述
你可以使用fshow来查看任意模式表示的浮点数:
在这里插入图片描述
您还可以给出fshow十六进制和浮点值,它将破译它们的位结构。

5 评价

你的分数将根据以下分布计算,最高67分:
36 正确性点。
26 性能点。
5 风格点。

正确性点。你必须解决的谜题的难度等级在1到4之间,这样它们的加权总和就是36。我们将使用btest程序对函数进行评估,这将在下一节中介绍。如果一个谜题通过了btest的所有测试,你将获得全部的积分,否则没有积分。

性能点。在这门课上,我们主要关心的是你能否得到正确的答案。然而,我们希望向你灌输一种让事情尽可能简短和简单的意识。此外,有些谜题可以通过蛮力解决,但我们希望你更聪明。因此,对于每个函数,我们已经为每个函数建立了允许使用的最大操作符数量。这个限制非常大,只设计用来捕获异常低效的解决方案。每一个满足运算符限制的正确函数,你将得到2分。

风格点。最后,我们为你们的解决方案风格和评论留了5点主观评价。你的解决方案应该尽可能的简洁和直接。你的评论应该是信息丰富的,但不必泛泛。

在你的作品上签名

我们在讲义目录中包含了一些自动升级工具——btest、dlc和driver.pl——以帮助您检查工作的正确性。

  • btest:这个程序检查bits.c中的函数的功能正确性。要构建和使用它,输入以下两个命令:
    在这里插入图片描述
    注意,每次修改bits.c文件时都必须重新构建btest。
    您会发现,一次处理一个函数,并对每个函数进行测试是很有帮助的。你可以使用-f标志来指示btest只测试一个函数:
    在这里插入图片描述
    你可以使用选项标志-1、-2和-3为它提供特定的函数参数:
    在这里插入图片描述
    关于运行btest程序的文档,请查看README文件。
  • dlc:这是一个来自MIT CILK小组的ANSI C编译器的修改版本,你可以用它来检查每个谜题的编码规则是否符合。典型的用法是:
    在这里插入图片描述
    程序将静默运行,除非它检测到问题,例如非法操作符、太多操作符或整数谜题中的非直线代码。使用-e开关运行:
    在这里插入图片描述
    导致DLC打印每个函数使用的操作符数量的计数。输入./dlc -help以获取命令行选项列表。
  • driver.pl:这是一个驱动程序,使用btest和dlc计算正确性和性能点为您的解决方案。它不带参数:
    在这里插入图片描述
    您的导师将使用driver.pl来评估您的解决方案。

6 提交指令

特点地点:在这里插入文本,告诉每个学生如何在你的学校提交他们的bits.c解决方案文件。

7建议

  • 不要在bits.c文件中包含<stdio.h>头文件,因为它会混淆dlc并导致一些非直观的错误消息。您仍然可以在bits.c文件中使用printf进行调试,而不包含<stdio.h>头文件,尽管gcc将打印一个您可以忽略的警告。
  • DLC程序强制执行比C++更严格的C声明形式,或者由GCC强制执行。特别是,任何声明都必须出现在非声明语句之前的块中(用大括号括起来)。例如,它会抱怨以下代码:
    在这里插入图片描述

8 “击败教授”比赛

为了好玩,我们提供了一个可选的“击败教授”比赛,让你可以与其他学生和老师竞争,开发出最有效的谜题。目标是用最少的操作员解决每个数据实验室难题。对于每一个题目,符合或超过讲师操作员计数的学生都是赢家!

如欲提交参赛作品,请输入:
在这里插入图片描述
昵称限制为35个字符,可以包含字母数字、撇号、逗号、句点、破折号、下划线和&号。你可以随时提交。您最近提交的将出现在实时记分板上,仅以您的昵称识别。您可以通过将浏览器指向来查看计分板
http://$SERVER_NAME:$REQUESTD_PORT
特定地点:将$SERVER_NAME和$REQUESTD_PORT替换为您在./contest/ Contest.pm文件中设置的值。

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,这里是您要求的回答: 这个问题涉及到计算机系统实验课程——深入理解计算机系统(CS:APP)的第一个lab任务,也称为Data Lab。这个任务要求学生使用C语言编写函数来实现不同的位级操作,从而深入理解计算机中数字的存储和运算。 ### 回答2: 在Data Lab的第二部分中,我们学习了如何用不超过十六个操作来实现不同的位运算。这些操作包括移位,逻辑运算,比较和掩码等。通过这些操作的实现,我们可以进一步理解底层计算机系统中位运算的实现原理。 在实现这些操作时,我们需要了解底层计算机系统的运算和数据类型。如符号扩展、零扩展和反码等。同时,在编写代码时需要熟练使用位运算的操作符号以及一些基本控制流语句如循环、条件语句等。 除了实现这些基本操作,我们也需要应用这些操作来解决一些实际问题。例如,实现一个函数,将一个十六进制数按位转,或是计算一个整数二进制表示中1的数量等。 通过Data Lab的学习,我们深入了解了计算机系统中底层的位运算实现原理,并学会了如何用简洁高效的代码实现这些操作。同时,这些操作也常常被用在各种领域的计算机编程中,对于未来的学习与工作都有很大的帮助。 ### 回答3: 在《深入理解计算机系统lab1:data lab(二)中,我们主要学习了位运算和两个的补码表示。这些知识对于我们了解计算机的原理和编码方式非常重要。 在这个实验中,我们需要完成一些与位运算相关的任务。其中包括: 1. 实现位运算。我们需要用 C 语言实现一些常见的位运算,如与、或、非、异或、左移、右移等。 2. 计算 x 的相反数。 3. 检查 x 是否为零。 4. 判断 x 的符号是否为负数。 5. 计算 x 和 y 的和,但不能使用加法运算。 为了完成这些任务,我们需要对 C 语言数据类型的细节和位运算的器级实现有一定的了解。例如,我们要了解有符号整数和无符号整数的区别,以及它们在器上的表示方式。我们还需要理解位运算的计算过程,包括位移的规则、符号扩展和逻辑运算等。 通过这个实验,我们可以更深入理解计算机的工作原理,学会用底层的方式实现高级的运算,掌握常用的位运算技巧。这对于提高编程的效率和代码的可读性都有很大帮助。同时,这也为后续的计算机科学学习打下了坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值