首页 > 其他分享 >CSAPP笔记:Lecture 02 Bits, Bytes and Integer

CSAPP笔记:Lecture 02 Bits, Bytes and Integer

时间:2024-08-02 17:55:55浏览次数:9  
标签:02 CSAPP TMin 符号 Bytes TMax 补码 截断 正数

位移操作

  1. 二进制优势在于容易表示、抗干扰等,在表示模拟信号的时候也有优势。
  2. 运算符
    1. &, |, !
    2. &&, ||, !!
    3. >>, << :位移运算又分为逻辑位移、算术位移, 其中理解算数右移需要理解计算机内如何表示负数.

位移实验

移动的位数等于int的位数(4bytes * 8 = 32bis),结果不变。

weiyi1

如果是31位的话:

weiyi2

书中的描述:在许多机器上,当移动一个 \(w\) 位的值时,移位指令只考虑位移量的低 \(log_2w\) 位,因此实际上位移量是通过计算\(k\;mod\;w\)得到的,这里的\(k\)是程序写的位移量。所以位移32位,32 mod 32 = 0,31 mod 32 = 31,因此前者相当于没位移(结果不变,是1012),后者位移了31位。

这个思路下,如果\(x = 1\),也就是\(00....1\),位移31位后,是\(100...0\),那它应该是\(MiniamlInteger\)的值。

weiyi3

\(B2U(Unsigned)\) 和 \(B2T(Two's complement)\) 有专门的计算公式. 前者是无符号数, 后者是补码.

二进制转无符号数是把对应比特位的2的幂累加.

\[B2U(X) = \sum_{i=0}^{w-1}x_{i}\cdot2^{ i} \]

转补码 我们学到的是正数的补码就是其本身, 负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1).

\[B2T(X) = -x_{w-1}\cdot2^{w-1}+\sum_{i=0}^{w-2}x_{i}\cdot2^{i} \]

理解了之后, 可以知道 \(Umin = 0, UMax = 2^w - 1, TMin = -2^{w-1}, TMax = 2^{w-1} - 1\). 其中补码的 \(w-1\) 可以理解成减去了最高位符号位.

此外, 从公式上也可以观察到, $ |TMin| = TMax + 1, UMax = 2 * TMax + 1$.

\(T\) 的-1, 以及 \(UMax\) 是 \(111...1\). 从公式上或者之前学到的都可以理解.

在做强制转换(Casting)的时候要注意这些特性, 比如 \(-1 > 0U\) , 这是因为无符号数的转换导致了-1变成了 \(UMax\). 混合计算的默认情况下有符号数会被隐式转换成无符号数.

所以要知道, \(-1 > -2, -1U > -2\) , 两者的底层逻辑是不一样的.

又比如 \(2147483647U < -2147483647-1\), 这时候前者是 \(TMax = 01...1\), 后者是 \(TMin = 100..0\), 都是无符号数的情况下, 两者差1.

#include <iostream>
#include <climits>
using namespace std;

int main() {
    unsigned int i = INT32_MAX; // 2147483647U
    int j = INT32_MIN; // -2147483647-1 = -2147483648
    unsigned k = j;
    cout << "i: " << i << endl;
    cout << "j: " << j << endl;
    cout << "k: " << k << endl;
    bool res = i < j;
    cout << "res: " << res << endl;
    return 0;
}

// i: 2147483647
// j: -2147483648
// k: 2147483648
// res: 1

\(TMin\) 用 \(-TMax -1\) 的写法是因为 \(TMin = 100..0, TMax = 01...1\), 在编程中,特别是处理整数范围时,我们有时需要定义一个最小值和最大值。例如,在处理有符号整数(signed integer)时,最大值(通常称为TMax)和最小值(通常称为TMin)是非常常见的定义。通常,这些值在表示整数的比特位数上有特定的关系。

以32位有符号整数为例:

  • 最大值(TMax):因为最高位是符号位,正数的最大值是\(2^{31} - 1\),即2147483647。
  • 最小值(TMin):最小值是负数,且比最大值多一个单位,因为0在正数的范围内。最小值是\(-2^{31}\),即-2147483648。

在这种情况下,最小值TMin可以用公式表示:$ TMin = -TMax - 1 $

这背后的原因是:

  1. 数值对称性:有符号整数范围是对称的,负数部分比正数部分多一个单位(因为包括0)。因此,负数的范围从\(-2^{31}\)到-1,而正数的范围从0到\(2^{31} - 1\)。
  2. 比特表示:有符号整数在计算机内部是用补码表示的。补码表示的特点使得最小负数比最大正数多一个单位。

通过这种表示方法,可以简化整数范围的定义和操作,也有助于在编写代码时避免溢出错误。简单来说,\(TMin = -TMax - 1\)这一写法是对有符号整数范围的一种精确定义,确保了范围的对称性和正确性。

转换 (Cast)

符号扩展 (Sing Expand)

比如8位数字扩展到16位数字, 如何去在不改变实际值的情况下扩展?

正数的情况, 符号位是0, 往前扩展0.

负数的情况, 符号位是1, 往前扩展1. 比如 \(1110\), 此时可以理解成 \(-8+4+2=-2\), 用取反+1也可以算. 扩展后变成 \(11110\), 此时是 \(-16+8+4+2=-2\) , 可以看到 \(-16+8=-8\), 新权重和旧权重加起来, 总和依然不变. 这也是二进制的特性.

总结一下就是无符号数扩展0, 有符号数扩展符号位.

截断 (Truncate)

基本是直接截断位数. 截断会不可避免地导致数据丢失, 所以要尽量避免.

无符号位的情况, 比如 \(11011 = 27, 1011 = 11\), 也可以说是 \(mod16\).

有符号位的情况, 比如 \(11011 = -5, 1011 = -5\). 这是Sign Expand带来的错觉, 需要理解成 \(mod 16\).

或者说 \(10011 = -13, 0011 = 3\), 这是 $ (16+2+1)mod16 = 3$.

在计算机中,有符号整数的表示方式通常使用补码(Two's Complement)。补码的一个重要特性是,可以用统一的方式表示正数和负数,并且可以直接使用二进制加法器来处理加减运算。

对于一个二进制数,如果我们将其截断到更少的位数,会影响它的表示和值。以下是详细解释:

补码表示法

首先,理解补码的基本概念。对于一个n位的二进制数:

  • 正数的补码表示与其原码(普通二进制表示)相同。
  • 负数的补码表示是将该数的绝对值按位取反,然后加1。

示例分析

假设我们有一个5位的二进制数 10011,以及一个4位的二进制数 0011。我们来逐步分析它们的补码表示和截断后的影响。

1. 原数 10011 (5位)

  • 这个数是一个5位的二进制数,最高位是1,表示这是一个负数。
  • 计算其补码:
    • 取反:10011 -> 01100
    • 加1: 01100 + 1 = 01101
    • 所以,10011 的绝对值是 01101 (即13),原数是 -13

2. 截断到4位:0011

  • 截断后只保留低4位:0011
  • 0011 是一个4位的二进制数,最高位是0,表示这是一个正数。
  • 直接计算值:0011 的值是 3

截断导致的问题

截断的过程中,最左边的一位被舍弃,这改变了数值的符号和大小。在补码表示法中,最高位(符号位)的变化会直接影响数值的正负,因此截断后的结果可能与原来的数值有很大的差异。

总结起来,10011 是一个5位的负数,截断为 0011 后变成了4位的正数,这种截断操作破坏了原有的补码结构,导致负数 -13 变成了正数 3

图示

更直观的解释可以通过图示:

原数: 10011 (5位,补码表示 -13)
截断: 0011  (4位,补码表示 3)

因此,截断操作改变了符号位和数值位,导致 -13 变成 3

标签:02,CSAPP,TMin,符号,Bytes,TMax,补码,截断,正数
From: https://www.cnblogs.com/joey-redfield/p/18339296

相关文章

  • 【闲话】08.02.24
    0802闲话头图:今日推歌:《レディメイドfeat.Ado》すりぃ123で弾け飛んだ一、二、三绽破而飞固定観念バットで打って固定概念用球棒击碎どうだい?どうだい?如何如何楽ならまっいっか觉得快乐的话就无所谓啦我还是现充的时候就喜欢上这首歌了,,,看到自己去年说......
  • 2024短剧系统|追剧影视小程序|付费短视频小剧场|带支付收益等模式APP源码
    随着数字娱乐产业的蓬勃发展,2024年的短剧市场迎来了前所未有的机遇与挑战。为了满足用户日益增长的个性化需求,一款集追剧影视小程序与付费短视频小剧场于一体的APP系统应运而生,它不仅革新了短剧内容的呈现方式,还通过创新的支付收益模式为创作者和平台带来了全新的盈利模式。本......
  • DASCTF2022.07赋能赛PWN部分WP
    DASCTF2022.07赋能赛PWN部分WPeyfor程序保护情况64位ida逆向可以看见是一个随机数的逻辑,只要我们猜不对4次就可以进入漏洞函数,但是我感觉这原本可能是==号,让用随机数的那我们就4次不输入一个数就可以进入漏洞函数,这里注意这个a1就是我们进入漏洞函数之前要输入的值,可以看见......
  • 022.(附加)chromedriver编译-绕过selenium机器人检测
    有小伙伴说使用selenium没能绕过机器人检测,盘他。一、selenium简介Selenium是一个强大的工具,用于Web浏览器自动化,更常被用于爬虫但selenium需要通过webdriver来驱动chrome,每次运行selenium时,都要先找到对应版本的chromedriver.exe。chromedriver自动化会对浏览器的部分属......
  • 图像处理案例02
    手指拖拽屏幕上的方块儿1步骤:1.opencv获取视频流2.获取手指关节关键点坐标3.判断手指是否在方块上4.如果在方块上,方块跟着手指移动2代码importcv2importnumpyasnpimportmathimportmediapipeasmp##检测手掌参数设置mp_drawing=mp.solutions.drawing_util......
  • 【学术会议征稿】第二届智能通信与网络国际学术会议(ICN 2024)
    第二届智能通信与网络国际学术会议(ICN2024)The 2ndInternationalConferenceonIntelligentCommunicationandNetworking第二届智能通信与网络国际学术会议(ICN2024)将于2024年11月15-17日在中国沈阳召开。ICN2024将围绕智能通信与网络的最新研究领域,为来自国内外高等......
  • 【学术会议征稿】第三届图像处理、计算机视觉与机器学习国际学术会议(ICICML 2024)
    第三届图像处理、计算机视觉与机器学习国际学术会议(ICICML2024)20243rd InternationalConferenceonImageProcessing,ComputerVisionandMachineLearning 重要信息大会官网:参会投稿/了解会议详情大会时间:2024年11月22日-24日 大会地点:中国深圳接受/拒稿......
  • 网络安全(黑客)——自学2024
    一、什么是网络安全网络安全是一种综合性的概念,涵盖了保护计算机系统、网络基础设施和数据免受未经授权的访问、攻击、损害或盗窃的一系列措施和技术。经常听到的“红队”、“渗透测试”等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。作为......
  • 2024年网络安全学习指南!详尽路线图,从零基础到黑客高手的进阶之路!_网络安全自学路线图
    零基础小白,到就业!入门到入土的网安/黑客学习路线!建议的学习顺序:一、网络安全学习普法(心里有个数,要进去坐几年!)1、了解并介绍《网络安全法》2、《全国人大常委会关于维护互联网安全的决定》3、《中华人民共和国计算机信息系统安全保护条例(2011年修正)》4、《中华人民共......
  • 【笔记】计数选讲:容斥、LGV、集合幂级数、GF 2024.8.2
    今天写的很乱。[HEOI2013]SAO容斥。因为我们已经知道父亲\(<\)儿子时的情况(\(n!/\prod_isiz_i\),也适用于森林),那么儿子\(<\)父亲的情况就容斥掉,无限制的就当作那条边不存在。树上背包,记录当前节点为根的连通块大小和容斥系数的积。*[ECFinal23A]DFSOrder4转写为:统计多......