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

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…

js手写面试题【附带注释】

文章目录 前言数组方法手写pushpopshiftunshiftcancatslicespliceforEachmapreducefind 手写订阅发布手写单例模式后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;javaScript &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和…

代码安全-exe的代码签名和代码混淆加密

信息安全相关 - 建设篇 第四章 代码安全-exe的代码签名和代码混淆加密 信息安全相关 - 建设篇系列文章回顾代码安全-exe的代码签名和代码混淆加密前言实施步骤C#程序的程序集引用使用强命名(可选)Windows Server AD CA 制作自定义的证书模板,用于代码签名生成拥有自签名CA的代…

Java并发编程CAS

目录 CAS是什么 CAS存在问题 ABA问题 CPU开销大 不能保证代码块的原子性 CAS实例 CAS是什么 CAS(Compare and Swap,比较并交换)是一种并发编程中的原子操作,用于实现多线程环境下的无锁同步。它是一种乐观锁策略,通过比较内存中的值与期望值是否相等来决定是否更…

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

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

龟兔赛跑python小游戏

# turtle控制游戏角色&#xff0c;Screen控制画布 from turtle import Turtle,Screen import time# 创建画布 screen Screen()# 改变画布大小 screen.setup(1200,600)# 设置背景图&#xff08;必须是gif格式&#xff09; screen.bgpic(背景图.gif)# 设置乌龟的角色 screen.reg…

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…

NOI / 1.8编程基础之多维数组 提问24:蛇形填充数组 c语言

描述 用数字1,2,3,4,...,n*n这n2个数蛇形填充规模为n*n的方阵。 蛇形填充方法为&#xff1a; 对于每一条左下-右上的斜线&#xff0c;从左上到右下依次编号1,2,...,2n-1&#xff1b;按编号从小到大的顺序&#xff0c;将数字从小到大填入各条斜线&#xff0c;其中编号为奇数的…

[Android] c++ 通过 JNI 调用 JAVA

Calling Java from C with JNI - CodeProject

Python进程之间同步实现代码

1、 # coding : UTF-8 import multiprocessing, time # 导入多进程的开发模块 def worker(dict): # 进程的处理函数 while True: # 持续售票 number dict.get("ticket") # 获得当前的票数 if number > 0 : # 如果现在还有剩余票 …

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

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

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

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

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

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

makefile中常见的环境变量

makefile中常见的环境变量 1&#xff09;CFLAGS&#xff1a;用于指定C语言编译器的选项&#xff0c;例如优化级别、警告级别、编译器标志等。 2&#xff09;CXXFLAGS&#xff1a;用于指定C语言编译器的选项&#xff0c;与CFLAGS类似&#xff0c;但专门针对C代码。 3&#xff0…

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

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

米贸搜|如何设置 Facebook 转换 API + 事件重复数据删除

Facebook Pixel 可让您跟踪用户在您网站上的行为、收集再营销受众并创建相似对象。如果 Facebook 像素实现正确&#xff0c;它将向 FB 机器学习算法提供相关信息。 FB ML 将使用像素数据向最有可能转化的人展示您的广告。 几年来&#xff0c;我们可以通过 JavaScript 代码、应…

MapReduce概念

1、概念 MapReduce 是一种编程模型&#xff0c;用于大规模数据集的并行处理。它是由 Google 开发的&#xff0c;用于处理大规模数据集的分布式计算框架。 MapReduce 的主要作用是将一个大的任务分解成多个小的任务&#xff0c;并在多台机器上并行执行这些任务。它包括两…

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

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