csapp datalab

知识点总结

1. 逻辑运算符关系

and(与)、or(或)和xor(异或)是逻辑运算符,用于对布尔值进行操作。它们可以在不同的逻辑表达式之间进行转换。下面是and、or和xor之间的转换规则:

  • and转换为or: a and b = !(a or b) (取反)
  • or转换为and: a or b = !(a and b) (取反)
  • xor转换为and和or: a xor b = (a and !b) or (!a and b)

2. 补码

二进制补码(Two’s complement)是一种表示有符号整数的方法。它是计算机中常用的表示负数的方式。
在二进制补码表示中,最高位(最左边的位)被用作符号位,0表示正数,1表示负数。其余位表示数值的绝对值。
二进制补码的转换规则如下

  • 对于正数,其二进制补码就是其二进制表示本身。
  • 对于负数,首先需要将其绝对值转换为二进制表示,然后对其进行按位取反操作(即将0变为1,将1变为0),最后再加1。例如,对于十进制数-5,其二进制补码的转换步骤如下:将5转换为二进制表示:5 = 00000101,对二进制表示按位取反:11111010,将取反后的结果加1:11111011,所以,-5的二进制补码为11111011。
    在这里插入图片描述
    使用二进制补码表示有符号整数,可以方便地进行加法和减法运算,而无需特殊处理符号位。此外,二进制补码的表示范围也比使用其他方法表示负数更广泛。

补码范围:
补码是一种表示有符号整数的方法,它使用最高位作为符号位,0表示正数,1表示负数。补码的范围取决于使用的位数。
对于n位二进制补码表示,最小的补码整数是将最高位设置为1,其余位设置为0,最大的补码整数是将所有位都设置为1。
以8位二进制补码为例,最小的补码整数是:
10000000
这个二进制数的十进制表示是-128。
最大的补码整数是:
01111111
这个二进制数的十进制表示是127。
因此,8位二进制补码表示的范围是-128到127。
对于n位二进制补码,范围可以表示为-2 ^ (n-1) 到 2 ^ (n-1)-1。

3. int 获取负数

int类型的二进制表达式是用二进制数字表示一个整数。在C语言中,int类型通常是有符号的,因此它使用补码表示法来表示负数。

对于有符号的int类型,它占用固定的位数(通常是32位),其中最高位(最左边的一位)是符号位,用来表示正负。如果符号位为0,则表示该整数是正数;如果符号位为1,则表示该整数是负数。

以下是一个示例,展示了一个有符号32位int类型的二进制表达式:

00000000 00000000 00000000 00000000   // 0
00000000 00000000 00000000 00000001   // 1
00000000 00000000 00000000 00000010   // 2
...
01111111 11111111 11111111 11111110   // 2147483646
01111111 11111111 11111111 11111111   // 2147483647 (INT_MAX)
10000000 00000000 00000000 00000000   // -2147483648 (INT_MIN)
10000000 00000000 00000000 00000001   // -2147483647
10000000 00000000 00000000 00000010   // -2147483646
...
11111111 11111111 11111111 11111110   // -2
11111111 11111111 11111111 11111111   // -1

需要注意的是,整数的二进制表达式是从右向左排列的,最右边的一位是最低位,最左边的一位是最高位。每个二进制位表示一个权值,从右向左依次为1、2、4、8、16、32、64、128、256、…,以此类推。

对于无符号的int类型(即unsigned int),它也占用固定的位数(通常是32位),但没有符号位,因此可以表示更大的正整数。

以上是一个简单的示例,展示了int类型的二进制表达式。实际上,具体的二进制表达式可能会因编译器和平台的不同而有所不同。如果需要精确地了解某个特定编译器和平台上int类型的二进制表达式,可以使用位运算或相关的工具来查看。

简单来说就是 x 的负数就是 ~x+1

4. 判断字符是否是digit

在这里插入图片描述

5. 正数和负数的左移和右移

在C语言中,对于正数的左移操作和右移操作,补充的是零。
正数左移:

unsigned int x = 5;       // 二进制表示为 00000101
unsigned int result = x << 2;  // 左移2位,移动后的结果为 00010100,等于20

正数右移:

unsigned int x = 20;       // 二进制表示为 00010100
unsigned int result = x >> 2;  // 右移2位,移动后的结果为 00000101,等于5

负数右移:

int x = -20;       // 二进制表示为 11101100
int result = x >> 2;  // 右移2位, 移动后的结果为 11111011,等于-5

对于负数的左移操作,结果是未定义的。这是因为左移操作可能导致符号位发生改变,而C语言并没有明确规定负数左移的补充规则。因此,负数的左移操作是不可靠的,应该避免使用。

6. 负数使用逻辑非

这是因为非零的值在逻辑上被视为真,而逻辑非运算符将其取反得到假的结果。

int x = -10;
int result = !x;// result 的值为 0

7. 逻辑取反运算符有两种形式:~ 和 !。

逻辑取反运算符有两种形式:~!

  1. ~ 运算符是按位取反运算符,用于对一个整数的二进制表示进行按位取反操作。它将每个二进制位的值进行翻转,即0变为1,1变为0。~ 运算符只适用于整数类型。

  2. ! 运算符是逻辑取反运算符,用于对一个表达式的逻辑值进行取反操作。如果表达式的值为真(非零),则 ! 运算符将其取反为假(0),如果表达式的值为假(0),则 ! 运算符将其取反为真(非零)。! 运算符适用于任何标量类型,包括整数、浮点数和指针类型。

以下是两种运算符的示例:

int x = 10;
int y = 0;
int result1 = ~x;  // result1 的值为 -11
int result2 = !y;  // result2 的值为 1

在上面的示例中,~x 对整数 x 进行按位取反操作,结果为 -11。而 !y 对整数 y 进行逻辑取反操作,因为 y 的值为0,所以结果为1。

8. 溢出问题

例如: int的范围是
01111111 11111111 11111111 11111111 // 2147483647 (INT_MAX)
10000000 00000000 00000000 00000000 // -2147483648 (INT_MIN) == 2 ^ 31
-2 ^ 31 - ( -2 ^ 31) 会出现溢出问题

9. 浮点数

浮点数编码是一种将浮点数值转换为二进制表示的过程。在计算机中,浮点数通常使用IEEE 754标准进行编码。

IEEE 754标准定义了两种浮点数表示格式:单精度(32位)和双精度(64位)。这两种格式都包括三个部分:符号位、指数位和尾数位。

符号位用于表示浮点数的正负性,占据了编码中的第一位。0表示正数,1表示负数。

指数位用于表示浮点数的指数部分,确定浮点数的大小范围。在单精度编码中,指数位占据了接下来的8位,而在双精度编码中,指数位占据了接下来的11位。

尾数位用于表示浮点数的小数部分,确定浮点数的精度。在单精度编码中,尾数位占据了接下来的23位,而在双精度编码中,尾数位占据了接下来的52位。

通过这种编码方式,浮点数可以以二进制形式存储和计算。然而,由于浮点数编码的特殊性,可能会出现精度损失和舍入误差等问题。因此,在进行浮点数计算时,需要注意这些问题可能带来的影响。

问题合集

1. makefile

在这里插入图片描述
删除m32:
使用gcc -m32编译的可执行文件无法在64位操作系统上运行。这是因为gcc -m32选项会将代码编译为32位的目标平台,生成的可执行文件只能在32位操作系统上运行。

在64位操作系统上运行32位可执行文件需要在系统上安装相应的32位库和运行环境。如果你尝试在64位操作系统上运行32位可执行文件,可能会遇到错误,例如缺少所需的库或不兼容的系统调用。

在这里插入图片描述

在这里插入图片描述

如果你希望在64位操作系统上运行代码,你应该使用默认的gcc命令来编译代码,而不是使用gcc -m32选项。这样将生成适用于64位目标平台的可执行文件。

2. c文件不是cpp文件

打印函数使用# include <stdio.h>

参考答案和解析

https://zhuanlan.zhihu.com/p/106109635

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/125624.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringCloud 微服务全栈体系(九)

第九章 Docker 三、Dockerfile 自定义镜像 常见的镜像在 DockerHub 就能找到&#xff0c;但是我们自己写的项目就必须自己构建镜像了。 而要自定义镜像&#xff0c;就必须先了解镜像的结构才行。 1. 镜像结构 镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而…

OpenCV官方教程中文版 —— 分水岭算法图像分割

OpenCV官方教程中文版 —— 分水岭算法图像分割 前言一、原理二、示例三、完整代码 前言 本节我们将要学习 • 使用分水岭算法基于掩模的图像分割 • 函数&#xff1a;cv2.watershed() 一、原理 任何一副灰度图像都可以被看成拓扑平面&#xff0c;灰度值高的区域可以被看成…

深入探索 C++ 多态 ② - 继承关系

前言 上一章 简述了虚函数的调用链路&#xff0c;本章主要探索 C 各种继承关系的类对象的多态特性。 深入探索 C 多态 ① - 虚函数调用链路深入探索 C 多态 ② - 继承关系深入探索 C 多态 ③ - 虚析构 1. 概述 封装&#xff0c;继承&#xff0c;多态是 C 的三大特性&#xf…

驱动day10作业

基于platform驱动模型完成LED驱动的编写 驱动程序 #include <linux/init.h> #include <linux/module.h> #include<linux/platform_device.h> #include<linux/mod_devicetable.h> #include<linux/of.h> #include<linux/of_gpio.h> #inclu…

基于深度学习的安全帽识别检测系统(python OpenCV yolov5)

收藏和点赞&#xff0c;您的关注是我创作的动力 文章目录 概要 一、研究的内容与方法二、基于深度学习的安全帽识别算法2.1 深度学习2.2 算法流程2.3 目标检测算法2.3.1 Faster R-CNN2.3.2 SSD2.3.3 YOLO v3 三 实验与结果分析3.1 实验数据集3.1.1 实验数据集的构建3.1.2 数据…

iOS的应用生命周期以及应用界面

在iOS的原生开发中&#xff0c;我们需要特别关注两个东西&#xff1a;AppDelegate和ViewController。我们主要的编码工作就是在AppDelegate和ViewControlle这两个类中进行的。它们的类图如下图所示&#xff1a; AppDelegate是应用程序委托对象&#xff0c;它继承了UIResponder类…

均值、方差、标准差

1 中间值和均值 表现&#xff02;中间值&#xff02;的统计名词&#xff1a; a.均值:   mean&#xff0c;数列的算术平均值&#xff0c;反应了数列的集中趋势,等于有效数值的合除以有效数值的个数&#xff0e;b.中位值:  median&#xff0c;等于排序后中间位置的值&#x…

c++多线程

目录 一、进程与线程 二、多线程的实现 2.1 C中创建多线程的方法 2.2 join() 、 detach() 和 joinable() 2.2.1 join() 2.2.2 detach() 2.2.3 joinable() 2.3 this_thread 三、同步机制&#xff08;同步原语&#xff09; 3.1 同步与互斥 3.2 互斥锁&#xff08;mu…

在安装和配置DVWA渗透测试环境遇到的报错问题

安装环境 前面的安装我参考的这个博主&#xff1a;渗透测试漏洞平台DVWA环境安装搭建及初级SQL注入-CSDN博客 修改bug 1.首先十分感谢提供帮助的博主&#xff0c;搭建DVWA Web渗透测试靶场_dvwa 白屏-CSDN博客&#xff0c;解决了我大多数问题&#xff0c;报错如下&#xff1…

leetCode 137. 只出现一次的数字 II(拓展篇) + 模5加法器 + 真值表(数字电路)

leetCode 137. 只出现一次的数字 II 题解可看我的往期文章 leetCode 137. 只出现一次的数字 II 位运算 模3加法器 真值表&#xff08;数字电路&#xff09; 有限状态机-CSDN博客https://blog.csdn.net/weixin_41987016/article/details/134138112?spm1001.2014.3001.5501…

N-131基于jsp,ssm物流快递管理系统

开发工具&#xff1a;eclipse&#xff0c;jdk1.8 服务器&#xff1a;tomcat7.0 数据库&#xff1a;mysql5.7 技术&#xff1a; springspringMVCmybaitsEasyUI 项目包括用户前台和管理后台两部分&#xff0c;功能介绍如下&#xff1a; 一、用户(前台)功能&#xff1a; 用…

040-第三代软件开发-全新波形抓取算法

第三代软件开发-全新波形抓取算法 文章目录 第三代软件开发-全新波形抓取算法项目介绍全新波形抓取算法代码小解 关键字&#xff1a; Qt、 Qml、 抓波、 截获、 波形 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QML&#xff08;Qt Meta-Object …

【Linux】jdk Tomcat MySql的安装及Linux后端接口部署

一&#xff0c;jdk安装 1.1 上传安装包到服务器 打开MobaXterm通过Linux地址连接到Linux并登入Linux&#xff0c;再将主机中的配置文件复制到MobaXterm 使用命令查看&#xff1a;ll 1.2 解压对应的安装包 解压jdk 解压命令&#xff1a;tar -xvf jdk 加键盘中Tab键即可…

「Dr. Bomkus 的试炼」排行榜说明

简要概括 七大区域&#xff0c;一个任务&#xff1a;六场扣人心弦的试炼&#xff0c;有一个休闲大厅作为每场试炼的起点。 试炼 排行榜&#xff1a;掌握每场试炼&#xff0c;攀登排行榜。 以 Ethos Point 来记分&#xff1a;每个试炼中的任务都会获得一个EP。 两种任务类型&am…

idea提交代码一直提示 log into gitee

解决idea提交代码一直提示 log into gitee问题 文章目录 打开setting->Version control->gitee,删除旧账号&#xff0c;重新配置账号&#xff0c;删除重新登录就好 打开setting->Version control->gitee,删除旧账号&#xff0c;重新配置账号&#xff0c;删除重新登…

局域网内远程控制电脑的软件

局域网内远程控制电脑的软件在日常办公中&#xff0c;非常常见了。它可以帮助用户在局域网内远程控制其他电脑&#xff0c;实现文件传输、桌面展示、软键盘输入等功能。 局域网内远程控制电脑的软件有很多种&#xff0c;其中比较实用的有域之盾软件、安企神软件、网管家软件等等…

专业135总400+合工大合肥工业大学833信号分析与处理信息通信上岸经验分享

专业135总400合工大合肥工业大学833信号分析与处理信息通信上岸经验分享 基础课经验很多&#xff0c;大同小异&#xff0c;我分享一下自己的833专业课复习经验。 一&#xff1a;用到的书本 1.《信号与系统》&#xff08;第三版&#xff09;郑君里&#xff0c;高等教育出版社…

最新Microsoft Edge浏览器如何使用圆角

引入 最近我看了edge官方的文档&#xff0c;里面宣传了edge的最新UI设计&#xff0c;也就是圆角&#xff0c;但是我发现我的浏览器在升级至最新版本之后&#xff0c;却没有圆角 网上有很多人说靠实验性功能即可解锁&#xff0c;但是指令我都试过了&#xff0c;每次都是搜索无结…

记一次红队打的逻辑漏洞(验证码绕过任意用户密码重置)

八月初参加某市演练时遇到一个典型的逻辑漏洞&#xff0c;可以绕过验证码并且重置任意用户的密码。 首先访问页面&#xff0c;用户名处输入账号会回显用户名称&#xff0c;输入admin会回显系统管理员。&#xff08;hvv的时候蓝队响应太快了&#xff0c;刚把admin的权限拿到了&a…

实力验证 | 求臻医学满分通过CAP及NCCL组织的国内外三项室间质评

近日&#xff0c;求臻医学以满分的优异成绩通过了由美国病理学家协会&#xff08;College of American Pathologists&#xff0c;CAP&#xff09;组织的NGS−A 2023&#xff1a;Next−Generation Sequencing (NGS) – Germline、NEO-B 2023 Neoplastic Cellularity能力验证项目…