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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络协议--TCP的未来和性能

24.1 引言 TCP已经在从1200 b/s的拨号SLIP链路到以太数据链路上运行了许多年。在80年代和90年代初期&#xff0c;以太网是运行TCP/IP最主要的数据链路方式。虽然TCP在比以太网速率高的环境&#xff08;如T2电话线、FDDI及千兆比网络&#xff09;中也能够正确运行&#xff0c;但…

AcWing第 127 场周赛 - AcWing 5283. 牛棚入住+AcWing 5284. 构造矩阵 - 模拟+快速幂+数学

AcWing 5283. 牛棚入住 题目数据范围不大&#xff0c;直接暴力模拟即可 按照题目所说的意思即可。 #include <math.h> #include <stdio.h> #include <algorithm> #include <cstring> #include <iostream> using namespace std; const int N 1…

Spring Cloud之ElasticSearch的学习【详细】

目录 ElasticSearch 正向索引与倒排索引 数据库与elasticsearch概念对比 安装ES、Kibana与分词器 分词器作用 自定义字典 拓展词库 禁用词库 索引库操作 Mapping属性 创建索引库 查询索引库 删除索引库 修改索引库 文档操作 新增文档 查找文档 修改文档 全量…

使用内网穿透工具进行支付宝沙箱环境支付的SDK接口远程测试

Java支付宝沙箱环境支付&#xff0c;SDK接口远程调试【内网穿透】 1.测试环境 MavenSpring bootJdk 1.8 2.本地配置 获取支付宝支付Java SDK,maven项目可以选择maven版本,普通java项目可以在GitHub下载,这里以maven为例 SDK下载地址&#xff1a;https://doc.open.alipay.com…

删除的PPT怎么找回来?4个必备恢复方法!

“最近的期末展示需要制作一个PPT&#xff0c;我熬了几个大夜才完成了&#xff0c;但是不知道怎么的我在删除其他文件时不小心把这个PPT一起删掉了&#xff0c;有什么方法可以帮我找回这个误删的PPT吗&#xff1f;” 我们在工作和学习中&#xff0c;经常都需要使用到PPT&#x…

白票某度自媒体混剪剪辑视频素材/爬虫软件说明文档

大家好&#xff0c;我是淘小白~ 软件&#xff1a;某度自媒体混剪素材爬虫软件 语言&#xff1a;Python 说明文档&#xff1a; 1、自定义关键词采集 2、采集百度aigc视频素材&#xff0c;经过测试&#xff0c;使用剪映的文字成片某度视频素材&#xff0c;可过头条的原创检测…

杂牌行车记录仪特殊AVI结构恢复案例

最近遇到一个杂牌的行车记录仪需要恢复数据&#xff0c;其使用AVI格式&#xff0c;但是在扫描恢复的过程中却发现厂家对其AVI结构进行了“魔改”致程序无法正常识别 故障存储:16G SD卡 fat32文件系统 故障现象: 16G的SD卡&#xff0c;在发生事故后客户尝试自行接到手机上读…

Mybatis—基础操作

mybatis入门后&#xff0c;继续学习mybatis基础操作。 目录 Mybatis基础操作准备工作删除操作日志输入预编译SQLSQL注入参数占位符 新增操作基本新增添加后返回主键 更新操作查询操作根据id查询数据封装条件查询条件查询 Mybatis基础操作 准备工作 根据下面页面原型及需求&am…

【产品运营】产品需求应该如何管理

产品项目在进行时经常会有一些需求需要实现&#xff0c;需求是产品更新迭代的动力&#xff0c;需求也是从用户诉求转化而来&#xff1b;在做需求管理时&#xff0c;我们需要判断一个需求的优先级等方面&#xff0c;对产品进行优化&#xff1b; 目录&#xff1a; 一、 为什么要…

游戏在小米设备上因自适应刷新率功能,帧率减半

1&#xff09;游戏在小米设备上因自适应刷新率功能&#xff0c;帧率减半 2&#xff09;Lua在计算时出现非法值&#xff0c;开启Debugger之后不再触发 3&#xff09;如何在Unity中实现液体蔓延的效果 这是第357篇UWA技术知识分享的推送&#xff0c;精选了UWA社区的热门话题&…

【Tomcat】如何在idea上部署一个maven项目?

目录 1.创建项目 2.引入依赖 3.创建目录 4.编写代码 5.打包程序 6.部署项目 7.验证程序 什么是Tomcat和Servlet? 以idea2019为例&#xff1a; 1.创建项目 1.1 首先创建maven项目 1.2 项目名称 2.引入依赖 2.1 网址输入mvnrepository.com进入maven中央仓库->地址…

SpringBoot整合自签名SSL证书,转变HTTPS安全访问(单向认证服务端)

前言 HTTP 具有相当优秀和方便的一面,然而 HTTP 并非只有好的一面&#xff0c;事物皆具两面性&#xff0c;它也是有不足之处的。例如&#xff1a; 通信使用明文&#xff08;不加密&#xff09;&#xff0c;内容可能会被窃听。不验证通信方的身份&#xff0c;因此有可能会遭遇…

LSF 概览——了解 LSF 是如何满足您的作业要求,并找到最佳资源来运行该作业的

LSF 概览 了解 LSF 是如何满足您的作业要求&#xff0c;并找到最佳资源来运行该作业的。 IBM Spectrum LSF ("LSF", load sharing facility 的简称) 软件是行业领先的企业级软件。LSF 将工作分散在现有的各种 IT 资源中&#xff0c;以创建共享的&#xff0c;可扩展…

Vue 的双向数据绑定是如何实现的?

目录 1. 响应式数据 2. v-model 指令 3. 实现原理 4. 总结 Vue.js 是一款流行的前端 JavaScript 框架&#xff0c;它以其强大的双向数据绑定能力而闻名。双向数据绑定使得数据在视图和模型之间保持同步&#xff0c;并且任一方的变化都会自动反映到另一方。那么&#xff0c;…

【java爬虫】公司半年报数据展示

前言 前面有一篇文章介绍了使用selenium获取上市公司半年报的方法&#xff0c;这篇文章就给这些数据写一个简单的前端展示页面 上一篇文章的链接在这里 【java爬虫】使用selenium获取某交易所公司半年报数据-CSDN博客 首先来看一下整个页面的展示效果 前端页面采用vueeleme…

[架构之路-245/创业之路-76]:目标系统 - 纵向分层 - 企业信息化的呈现形态:常见企业信息化软件系统 - 企业资源管理计划ERP

目录 前言&#xff1a; 一、企业信息化的结果&#xff1a;常见企业信息化软件 1.1 企业资源管理计划 1.1.1 什么是ERP&#xff1a;企业最常用的信息管理系统 1.1.2 ERP的演进过程 1.1.3 EPR模块 1.1.4 EPR五个层级 1.1.5 企业EPR业务总体流程图 1.1.6 什么类型的企业需…

数据结构——线性表①(顺序表)

一、线性表定义 线性表是一种数据结构&#xff0c;它是由n个具有相同数据类型的数据元素a1,a2,…,an组成的有限序列。 其中&#xff0c;除第一个元素a1外&#xff0c;每一个元素有且只有一个直接前驱元素&#xff0c;除了最后一个元素an外&#xff0c;每一个元素有且只有一个…

公司电脑禁用U盘的方法

公司电脑禁用U盘的方法 安企神U盘管理系统下载使用 在这个复杂的数据时代&#xff0c;保护公司数据的安全性至关重要。其中&#xff0c;防止未经授权的数据泄露是其中的一个关键环节。U盘作为一种常用的数据传输工具&#xff0c;也成为了潜在的安全风险。因此&#xff0c;公司…

【ES专题】ElasticSearch快速入门

目录 前言从一个【搜索】说起 阅读对象前置知识笔记正文一、全文检索1.1 什么是【全文检索】1.2 【全文检索】原理1.3 什么是倒排索引 二、ElasticSearch简介2.1 ElasticSearch介绍2.2 ElasticSearch应用场景2.3 数据库横向对比 三、ElasticSearch环境搭建3.1 Windows下安装3.2…

pytorch:R-CNN的pytorch实现

pytorch&#xff1a;R-CNN的pytorch实现 仅作为学习记录&#xff0c;请谨慎参考&#xff0c;如果错误请评论指出。 参考文献&#xff1a;Rich Feature Hierarchies for Accurate Object Detection and Semantic Segmentation      https://blog.csdn.net/qq_41694024/cat…