《深入理解计算机系统》学习笔记 - 第三课 - 位,字节和整型

Lecture 03 Bits,Bytes, and Integer count 位,字节,整型

文章目录

  • Lecture 03 Bits,Bytes, and Integer count 位,字节,整型
    • 运算:加,减,乘,除
      • 加法
      • 乘法
        • 取值范围
        • 乘法结果
    • 使用无符号注意事项
    • 内存中的表现形式
      • 面向字节的内存组织形式
      • 字长 Words
    • 字节顺序
      • 大端序和小端序
      • 代码检验数据的表现形式
    • 字符串表示
    • 拓展
      • 二进制的一个属性
      • 汇编编码
        • 乘积编码
        • 除法编码
          • 无符号除法编码
          • 有符号除法编码
      • 读字节倒转清单
    • 问题
      • 为什么十进制使用普遍?
      • 为什么用最高位作为符号位?
    • 《深入理解计算机系统》书籍学习笔记

运算:加,减,乘,除

主要运算导致溢出的情况。
都是截去超出w位的高位值。

加法

  • 无符号加法
    操作两个w位相加,结果w+1位。
    u + v = (u + v) mod 2^w

  • 有符号加法
    操作两个w位相加,结果w+1位。
    溢出的部分截去。
    在这里插入图片描述

乘法

取值范围

w 位的数的乘法结果的范围:
最高2w 位。

  • 无符号
    范围:0 <= x * y <= (2^w - 1)^2 = 2^(2w) - 2^(w+1) + 1

  • 二进制补码
    范围:
    最小值: xy >= (-2^(w-1)) * (2^(w-1) -1) = -2^(2s-2) + 2^(w-1)
    最大值(TMin)^2:x
    y <= (-2(w-1))2 = 2^(2w-2)

乘法结果
  • 无符号位
    截去高序w位的值,也就是结果模2^w。
UMult(u,v) = u * v  mod 2^w
  • 有符号位
    截去高序w位的值。

  • 2的幂的乘积与位移的关系
    左移几位就是乘以2的几次幂。

u << k = u * 2^k
  • 无符号除法与位移关系
    右移几位,就是除以2的几次幂
u >> k = u / 2^k

使用无符号注意事项

无符号数绝对不会出现负值的情况。

#include <stdio.h>
#include <unistd.h>void main() {unsigned i;int cnt = 5;for (i = cnt - 2; i >= 0; i--) {usleep(100000);printf("%d,%u\n", i,i);}
}// output:
// 3,3
// 2,2
// 1,1
// 0,0
// -1,4294967295
// -2,4294967294
// -3,4294967293
// ....

程序将陷入死循环。
因为无符号永远大于0.

#include <stdio.h>
#include <unistd.h>void main() {#define DELTA sizeof(int)int i;int cnt = 10;for (i = cnt; i-DELTA >= 0; i-= DELTA) {usleep(100000);printf("%d\n",i);}
}// output:
// 10
// 6
// 2
// -2
// -6
// -10
// ...

解决无符号循环问题:
使用总数作为终止判断条件,而不是0.

void main() {unsigned i;int cnt = 5;for (i = cnt-2; i < cnt; i--) {printf("%d\n",i);}
}

内存中的表现形式

面向字节的内存组织形式

  • 程序通过地址指向数据
    从概念上讲,可以把它想象成一个非常大的字节数组。当然实际并非如此。
  • 地址就像数组的索引
    指针变量存储地址。

注意:系统给每个进程分配私有的地址空间。

字长 Words

面向字节内存组织方式
在这里插入图片描述

32位的四个字节,64位的八个字节。

字节顺序

大端序:最低有效位字节具有最高地址
小端序:最低有效位字节具有最低地址

4字节的值:0x01234567
A

大端序和小端序

现在几乎都是小端序。

大端序:人类更容易识别。
但是对于机器来说,无所谓,只要有统一标准就行。

代码检验数据的表现形式

指向unsigned char *的指针允许作为字节数组处理

#include <stdio.h>typedef unsigned char *pointer;void show_bytes(pointer start, size_t len) {size_t i;for (i = 0; i < len; i++)printf("%p\t0x%.2x\n", start+i, start[i]);printf("\n");
}void main() {int a= 15213;printf("int a = 15213;\n");show_bytes((pointer) &a, sizeof(int));
}// output:
// int a = 15213;
// 0x7ffc2881f59c  0x6d
// 0x7ffc2881f59d  0x3b
// 0x7ffc2881f59e  0x00
// 0x7ffc2881f59f  0x00

字符串表示

  • 用字符数组表示。
  • 每个字符使用ASCII格式编码
    • 字符集的标准7位编码
    • 字符0 使用 0x30 编码
      数字i 使用 ox30 + i 表示
  • 字符应该有空终止符
    使用字符0

char S[6] = "18213" 编码:
在这里插入图片描述

拓展

二进制的一个属性

1 + 1 + 2 + 4 + 8 + … + 2^(w-1) = 2^w
得出:
在这里插入图片描述

汇编编码

乘积编码
  • 乘积代码
    文件mul12.c:
long mul12(long x)
{return x*12;
}
  • 汇编代码
    生成汇编代码: gcc -O2 -S mul12.c
    汇编文件mul12.s:
leaq (%rax, %rax, 2), %rax   // t <- x + x*2
sqlq $2, %rax                // return t << 2;
除法编码
无符号除法编码
  • 除法代码
unsigned long udiv8(unsigned long x) {return x/8;
}
  • 汇编代码
    生成汇编代码: gcc -O2 -S udiv8.c
    汇编文件udiv8.s:
shrq $3, $rax    // return x >> 3;
有符号除法编码

与无符号类似,不过结果需要加1。

  • 除法代码
long udiv8(unsigned long x) {return x/8;
}
  • 汇编代码
    生成汇编代码: gcc -O2 -S udiv8.c
    汇编文件udiv8.s:
    testq %rax, %rax // if x < 0js L4
L3:shrq $3, $rax    // x >> 3;ret              // ret
L4:addq %7, %rax    // x += 7jmp L3

读字节倒转清单

按小端序读取:
在这里插入图片描述

问题

为什么十进制使用普遍?

因为人们有十个手指头。

为什么用最高位作为符号位?

我们看下二进制转化为有符号数公式:
在这里插入图片描述

满足了符号数以下特征:
整数负数各一半。

再问为什么不直接用符号位来表示正负数?
下面这种表示方式:

1001
= -1*(2^0) = -1

不利于无符号有符号的转换。

当然,主要这种情况可以满足所有情况了,我们没有必要再考虑去推翻它,这个没有必然的合理优势的话是不可能推翻的。

《深入理解计算机系统》书籍学习笔记

《深入理解计算机系统》学习笔记 - 第一课 - 课程简介
《深入理解计算机系统》学习笔记 - 第二课 - 位,字节和整型
《深入理解计算机系统》学习笔记 - 第三课 - 位,字节和整型

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

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

相关文章

Python Web包就业服务

还在等什么&#xff0c;加入我们&#xff0c;包就业

几何教学工具 Sketchpad几何画板 mac软件特色

Sketchpad几何画板 for Mac是一款适用于macOS系统的几何教学工具&#xff0c;用户可以在其画板上进行各种几何图形的绘制、演示&#xff0c;帮助教师了解学生的思路和对概念的掌握程度。此外&#xff0c;Sketchpad更深层次的功能则是可以用来进行几何交流、研究和讨论&#xff…

机柜浪涌保护器行业应用解决方案

机柜浪涌保护器是一种用于保护机柜内电子设备免受雷电或其他瞬时过电压影响的装置&#xff0c;它可以有效地限制或引导电涌电流&#xff0c;避免设备损坏或数据丢失。机柜浪涌保护器广泛应用于通信、电力、工业控制、医疗、安防等领域&#xff0c;是保障机柜系统安全稳定运行的…

centos服务器扩容

centos服务器扩容 我的情况是&#xff0c;原服务器是一个80g磁盘&#xff0c;管理员又追加了120G到这块磁盘上&#xff0c;需要把这120G重新追加使用。 请确认你遇到的情况是否和我初始截图一致&#xff0c;再往下看&#xff0c;免得浪费时间与精力 服务器中有120G尚未使用&…

JavaEE(SpringMVC)期末复习(选择+填空+解答)

文章目录 JavaEE期末复习一、单选题&#xff1a;二、多选题三、填空题四、解答 JavaEE期末复习 一、单选题&#xff1a; 1.Spring的核⼼技术是&#xff08; A &#xff09;&#xff1f; A依赖注入 B.JdbcTmplate C.声明式事务 D.资源访问 Spring的核心技术包括依赖注入&#x…

运维 | 四层和七层负载均衡介绍

关注: CodingTechWork 负载均衡 负载均衡介绍 概念 负载均衡是建立在现有的网络结构之上&#xff0c;提供一种廉价且透明的方式进行网络设备和服务器带宽的扩展&#xff0c;从而增加吞吐量&#xff0c;加强应用服务的数据处理能力&#xff0c;有效提高网络的灵活性和可用性。…

深度视觉目标跟踪进展综述

1 引言 目标跟踪旨在基于初始帧中指定的感兴趣目标( 一般用矩形框表示) &#xff0c;在后续帧中对该目标进行持续的定位。 基于深度学习的跟踪算法&#xff0c;采用的框架包括相关滤波器、分类式网络、双路网络等。 处理跟踪任务的角度&#xff0c;分为基于匹配思路的双路网…

操作系统——操作系统概论s

一、操作系统基本概念 1 操作系统定义 操作系统是裸机上的第一层软件&#xff0c;它是对硬件系统功能的首次扩充&#xff0c; 用以填补人与机器之间的鸿沟。 OS定义&#xff1a;操作系统是控制和管理计算机系统内各种硬件和软件资源&#xff0c;有效地组织多道程序运行的系统软…

W2311283-可燃气体监测仪怎么监测燃气管道

可燃气体监测仪怎么有效监测燃气管道 燃气管道遍布于城市地下各处&#xff0c;作为城市生命线的一部分&#xff0c;一旦燃气管网出现泄露问题便是牵一发而动全身&#xff0c;城市的整体安全也会受到威胁。但是如何才能科学管理和监测燃气管网呢&#xff1f; 燃气管网监测系统便…

「我在淘天做技术」迈步从头越 - 阿里妈妈广告智能决策技术的演进之路

作者&#xff1a;妙临、霁光、玺羽 一、前言 在线广告对于大多数同学来说是一个既熟悉又陌生的技术领域。「搜广推」、「搜推广」等各种组合耳熟能详&#xff0c;但广告和搜索推荐有本质区别&#xff1a;广告解决的是“媒体-广告平台-广告主”等多方优化问题&#xff0c;其中媒…

视频文案怎么写,媒介盒子支招

近几年短视频成为风口&#xff0c;各行各业都想分一杯羹&#xff0c;但是一头热的你&#xff0c;是否知道短视频的相关文案怎么写呢?正所谓兵马未动&#xff0c;文案先行&#xff0c;一个合适的文案是上热门的秘密武器&#xff0c;今天媒介盒子就来和大家聊聊&#xff1a;视频…

Doris-Routine Load(二十七)

例行导入&#xff08;Routine Load&#xff09;功能为用户提供了一种自动从指定数据源进行数据导入的功能。 适用场景 当前仅支持从 Kafka 系统进行例行导入&#xff0c;使用限制&#xff1a; &#xff08;1&#xff09;支持无认证的 Kafka 访问&#xff0c;以及通过 SSL 方…

小新 Air-14 2021 Intel处理器ITL版(82FF)原厂Win11系统

链接&#xff1a;https://pan.baidu.com/s/1EkqpdGcixCNER5uP5yIc4Q?pwddm1d 提取码&#xff1a;dm1d lenovo联想小新Air14笔记本2021款【82FF】原装出厂Windows11系统镜像ISO文件 系统自带所有驱动、出厂主题壁纸、系统属性专属LOGO标志、Office办公软件、联想电脑管家等…

手机如何去图片水印?试试这三种方法

手机如何去图片水印&#xff1f;去水印已然成为了自媒体从业者必备技能之一&#xff0c;无论是工作或生活中经常遇到图片/视频上带有水印&#xff0c;非常影响整体观感&#xff0c;网上去水印方法又很多&#xff0c;如果你是小白&#xff0c;这篇文章将提供给你三个实用去水印的…

草图大师sketchup道路怎么快速种树?

草图大师sketchup道路怎么快速种树&#xff1f;草图大师中的道路图纸想要在道路两旁种树&#xff0c;该怎么快速给道路种树呢&#xff1f;下面我们就来看看详细的教程&#xff0c;需要的朋友可以参考下 草图大师sketchup中想要快速种树&#xff0c;该怎么种多棵树呢&#xff1…

数据结构校招知识点总结

文章目录 前言1. 数据结构概论、算法设计与分析1.1 数据结构三要素&#xff1f;1.2 算法的基本概念&#xff1f;1.3 什么是时间复杂度&#xff1f; 2. 线性表2.1 链表结构和顺序存储结构的区别&#xff1f;2.2 单链表和双链表的区别&#xff1f;2.3 头指针和头结点的区别&#…

基于Python的网络爬虫设计与实现

基于Python的网络爬虫设计与实现 摘要&#xff1a;从互联网时代开始&#xff0c;网络搜索引擎就变得越发重要。大数据时代&#xff0c;一般的网络搜索引擎不能满足用户的具体需求&#xff0c;人们更加注重特定信息的搜索效率&#xff0c;网络爬虫技术应运而生。本设计先对指定…

上海数交所与合合信息发布产业数据行业创新中心,政产学研合力为“数据航母”加速

大数据产业是数字经济创新发展、加速发展的重要方向。11月25日&#xff0c;2023全球数商大会在上海盛大开幕。大会以“数联全球、商通未来”为主题&#xff0c;聚焦数字经济时代下&#xff0c;数据要素推动实体经济发展的规划与成果&#xff0c;是数据交易领域的行业级峰会和数…

Kafka 如何保证消息消费的全局顺序性

哈喽大家好&#xff0c;我是咸鱼 今天我们继续来讲一讲 Kafka 当有消息被生产出来的时候&#xff0c;如果没有指定分区或者指定 key &#xff0c;那么消费会按照【轮询】的方式均匀地分配到所有可用分区中&#xff0c;但不一定按照分区顺序来分配 我们知道&#xff0c;在 Kaf…

动态:class和:style绑定

1. 在应用界面中, 某个(些)元素的样式是变化的 class/style绑定就是专门用来实现动态样式效果的技术 2. 动态class绑定 :class等号后的变量值 可以是字符串 :class等号后 可以是对象 :class等号后 可以是数组 3. 动态style绑定 :style"{ color: myPinkColor, fontS…